CSDN泄露数据引发的思考

CSDN-中文IT社区-600万 数据泄露,我想这600多万中大部分是程序员吧。

 

而我们首先关心是的,这部分数据中是否有没有自己的。大部分编辑器打开会很卡,建议使用的软件

1.         Editplus

2.         WINHEX

3.         UltraEdit

这些软件基本都是一次把数据读入内存了(小内存机要注意喽,用了虚拟内存速度也会稍慢了一点)

或许有人窃喜没有自己的,有人担忧自己的密码泄露(很多人账号密码在不同的地方都一样),或许还有人图谋不轨(不过我相信程序员都是高素质的)

 

其实这个数据也是很有实验价值的。

1.         统计价值

a)         参考 http://www.cnbeta.com/articles/166576.htm

2.         实验价值

a)         对于一般程序员来说,这份数据还是很庞大的。可以做很多实验

 

由于鄙人属于特别好奇的那种,毫不犹豫做了两个实验。。。

 

实验一:将600万行导入mysql(PHP)

实验环境

1.win7+mysql+php+apache

2.mysql:utf-8编码,InnoDB

 

程序流程:php每一行的读取文件,通过正则表达式,提取用户名,密码,邮箱

 

 
  
  1. /**
  2. *作者:小桥流水
  3. *时间:2011-12-23
  4. */  
  5.     $count_pattern = 0;                     /*匹配成功个数*/ 
  6.     $count_query = 0;                       /*数据库插入成功个数*/ 
  7.     $filename = "www.csdn.net.sql";         /*打开的文件名*/ 
  8.     $pattern = "/(.+)\s#\s(.+)\s#\s(.+)/";  /*正则匹配模式串*/ 
  9.     $link = mysql_connect("localhost", "root", "password"); 
  10.     if(!$link){ 
  11.         echo "sql connect error!"; 
  12.         exit; 
  13.     } 
  14.     mysql_select_db("csdn",$link); 
  15.     mysql_query("set names gbk",$link); 
  16.      
  17.     echo "文件".$filename."大小为:".filesize($filename)." 字节
    "; 
  18.     date_default_timezone_set("PRC"); 
  19.     echo "开始时间:".date("Y-m-d H:i:s")."
    "; 
  20.     if($TheFile = fopen($filename, "r")){ 
  21.         $i = 0; 
  22.         while(!feof($TheFile)) 
  23.         { 
  24.             $line = fgetss($TheFile,255); 
  25.             if(preg_match($pattern, $line, $arr)){ 
  26.                 $count_pattern++; 
  27.                 $sql = "INSERT INTO user (username, psw, email) VALUES ('$arr[1]', '$arr[2]', '$arr[3]')"; 
  28.                 if(mysql_query($sql, $link)){ 
  29.                     $count_query++; 
  30.                 }else{ 
  31.                     echo "失败的sql语句:".$sql."
    "; 
  32.                 } 
  33.             } 
  34.             $i++; 
  35.             if($i%1000 == 0){ 
  36.                 echo "执行到第".$i."条...
    "; 
  37.                 if($i == 10000)/*只用前10000行做测试*/ 
  38.                     break; 
  39.             } 
  40.         } 
  41.              
  42.         if(!fclose($TheFile)){ 
  43.             echo "关闭文件句柄失败!"; 
  44.         } 
  45.     } 
  46.     echo "结束时间:".date("Y-m-d H:i:s")."
    "; 
  47.     mysql_close($link); 
  48.      
  49.     echo "
    -----------结果-----------
    "; 
  50.     echo "正则表达式匹配成功:".$count_pattern."条!
    "; 
  51.     echo "数据库插入成功:".$count_query."条!
    "; 
  52. ?>

 

测试结果:
 

1.10000行的结果

 

CSDN泄露数据引发的思考_第1张图片

有两条sql语句错误,主要原因是没有转义特殊字符,多次实验平均时间为12秒

由此判断这样插入数据,600万条数据需要10分种以上!

2.准备将600万条全部导入

首先,将php的脚本最大执行时间改一下,我改成1200(20分钟)。打开php.ini搜索max_execution_time

 

CSDN泄露数据引发的思考_第2张图片

重启apache,然后以下PHP代码

  1.   if($i == 10000)/*只用前10000行做测试*/ 
  2.                     break; 

 

注释掉, 浏览器执行请求,开始漫长的等待。。。等待中,查看这些数据a)php访问该文件速度
 

 

 

CSDN泄露数据引发的思考_第3张图片

大约:72.8KB/s (很慢哈)

b)mysql写入速度

 

CSDN泄露数据引发的思考_第4张图片

经过我的眼测:平均速度保持在5MB/S的写入,如果一直写20分钟的话,6G的空间就没了

 

3.实验结果

 

CSDN泄露数据引发的思考_第5张图片

 

这样的结果却是令人很失望,按照10000条计算 ,20分钟超过600倍的时间,还是没有插入完,甚至只插入了100万多条。(我想,IO速度越到后面,速度愈慢吧,就像复制文件一样,刚开始很快,过一会就慢下来了)

 

 

总结:每次只读取一行,IO速度很慢,浪费很多时间,同时mysql写入速度也是有限的

实验二:用php实现数据的搜索

实验环境一样

程序流程:每次也只读取一行

实验较简单,直接贴我的代码了

 

 
  
  1.  
  2.  
  3.     CSDN泄露数据查询 
  4.  
  5.  
  6. CSDN泄露数据查询

     
  7.     
     
  8.      
  9.      
  10.         关键字:
     
  11.          
  12.          
  13.      
  14.     
     
  15.  
  16. if($_GET["kw"]!='' && $_GET["kw"]!=NULL){ 
  17.     $sw = $_GET["kw"]; 
  18. }else{ 
  19.     exit; 
  20. echo "查询".$sw."
    "; 
  21. $filename = "www.csdn.net.sql"; 
  22.     date_default_timezone_set("PRC"); 
  23.     echo "开始时间:".date("Y-m-d H:i:s")."
    "; 
  24.     if($TheFile = fopen($filename, "r")){ 
  25.         $i = 0; 
  26.         $j = 0; 
  27.         while(!feof($TheFile)) 
  28.         { 
  29.             $line = fgetss($TheFile,255); 
  30.             if(strpos($line,$sw) != NULL){ 
  31.                 $line = preg_replace("/($sw)/i","\\1", $line); 
  32.                 echo "第".$i."行:".$line."
    "; 
  33.                 $j++; 
  34.             } 
  35.             $i++; 
  36.         } 
  37.              
  38.         if(!fclose($TheFile)){ 
  39.             echo "关闭文件句柄失败!"; 
  40.         } 
  41.          
  42.         if($j>0){ 
  43.             echo "共有".$j."条记录!
    "; 
  44.         }else{ 
  45.             echo "<没有查到:".$sw."
    "; 
  46.         } 
  47.     } 
  48.     echo "结束时间:".date("Y-m-d H:i:s")."
    "; 
  49.      
  50. ?> 
  51.  
  52.  
实验结果:
 

CSDN泄露数据引发的思考_第6张图片

平均时间大概:15秒


结论:IO和函数成为查询速度的瓶颈!

 

 

 

 

最后声明:以上实验纯属乱搞,别无它意。也请广大用户保护好自己的密码,正确对待这次事故。

你可能感兴趣的:(安全管理)