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

 

测试结果:
 

1.10000行的结果

 

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

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

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

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

 

重启apache,然后以下PHP代码

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

 

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

 

 

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

b)mysql写入速度

 

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

 

3.实验结果

 

 

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

 

 

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

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

实验环境一样

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

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

 

 
 
  1. <!--作者:小桥流水-->
  2. <html> 
  3. <head> 
  4.     <title>CSDN泄露数据查询</title> 
  5. </head> 
  6. <body> 
  7. <h2>CSDN泄露数据查询</h2> 
  8.     <hr> 
  9.      
  10.     <form method="get" action="test.php"> 
  11.         关键字:<input type="text" name="kw" size="30"><br> 
  12.         <input type="reset" value="重置"> 
  13.         <input type="submit" value="查询"> 
  14.     </form> 
  15.     <hr> 
  16. </p> 
  17. <? 
  18. if($_GET["kw"]!='' && $_GET["kw"]!=NULL){ 
  19.     $sw = $_GET["kw"]; 
  20. }else{ 
  21.     exit; 
  22. echo "查询<b>".$sw."</b><br>"; 
  23. $filename = "www.csdn.net.sql"; 
  24.     date_default_timezone_set("PRC"); 
  25.     echo "开始时间:".date("Y-m-d H:i:s")."<br>"; 
  26.     if($TheFile = fopen($filename, "r")){ 
  27.         $i = 0; 
  28.         $j = 0; 
  29.         while(!feof($TheFile)) 
  30.         { 
  31.             $line = fgetss($TheFile,255); 
  32.             if(strpos($line,$sw) != NULL){ 
  33.                 $line = preg_replace("/($sw)/i","<font color='red'><b>\\1</b></font>", $line); 
  34.                 echo "第".$i."行:".$line."<br>"; 
  35.                 $j++; 
  36.             } 
  37.             $i++; 
  38.         } 
  39.              
  40.         if(!fclose($TheFile)){ 
  41.             echo "关闭文件句柄失败!"; 
  42.         } 
  43.          
  44.         if($j>0){ 
  45.             echo "<font color='#22FF22'>共有".$j."条记录!</font><br>"; 
  46.         }else{ 
  47.             echo "<font color='red'><没有查到:".$sw."</font><br>"; 
  48.         } 
  49.     } 
  50.     echo "结束时间:".date("Y-m-d H:i:s")."<br>"; 
  51.      
  52. ?> 
  53. </body> 
  54. </html> 
实验结果:
 

平均时间大概:15秒


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

 

 

 

 

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值