您的位置:首页 > 其它

CSDN泄露数据引发的思考

2011-12-28 10:46 387 查看
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每一行的读取文件,通过正则表达式,提取用户名,密码,邮箱

<?php
/**
*作者:小桥流水
*时间:2011-12-23
*/

$count_pattern = 0;                     /*匹配成功个数*/
$count_query = 0;                       /*数据库插入成功个数*/
$filename = "www.csdn.net.sql";         /*打开的文件名*/
$pattern = "/(.+)\s#\s(.+)\s#\s(.+)/";  /*正则匹配模式串*/
$link = mysql_connect("localhost", "root", "password");
if(!$link){
echo "sql connect error!";
exit;
}
mysql_select_db("csdn",$link);
mysql_query("set names gbk",$link);

echo "文件".$filename."大小为:".filesize($filename)." 字节<br>";
date_default_timezone_set("PRC");
echo "开始时间:".date("Y-m-d H:i:s")."<br>";
if($TheFile = fopen($filename, "r")){
$i = 0;
while(!feof($TheFile))
{
$line = fgetss($TheFile,255);
if(preg_match($pattern, $line, $arr)){
$count_pattern++;
$sql = "INSERT INTO user (username, psw, email) VALUES ('$arr[1]', '$arr[2]', '$arr[3]')";
if(mysql_query($sql, $link)){
$count_query++;
}else{
echo "<font color ='blue'>失败的sql语句:".$sql."</font><br>";
}
}
$i++;
if($i%1000 == 0){
echo "执行到第".$i."条...<br>";
if($i == 10000)/*只用前10000行做测试*/
break;
}
}

if(!fclose($TheFile)){
echo "关闭文件句柄失败!";
}
}
echo "结束时间:".date("Y-m-d H:i:s")."<br>";
mysql_close($link);

echo "<font color='red'><br>-----------结果-----------<br>";
echo "正则表达式匹配成功:".$count_pattern."条!<br>";
echo "数据库插入成功:".$count_query."条!</font><br>";
?>

测试结果:

1.10000行的结果




有两条sql语句错误,主要原因是没有转义特殊字符,多次实验平均时间为12秒
由此判断这样插入数据,600万条数据需要10分种以上!
2.准备将600万条全部导入
首先,将php的脚本最大执行时间改一下,我改成1200(20分钟)。打开php.ini搜索max_execution_time




重启apache,然后以下PHP代码
if($i == 10000)/*只用前10000行做测试*/
break;


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






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

b)mysql写入速度





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

3.实验结果





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

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

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

实验环境一样

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

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

<!--作者:小桥流水-->
<html>
<head>
<title>CSDN泄露数据查询</title>
</head>
<body>
<h2>CSDN泄露数据查询</h2>
<hr>

<form method="get" action="test.php">
关键字:<input type="text" name="kw" size="30"><br>
<input type="reset" value="重置">
<input type="submit" value="查询">
</form>
<hr>
</p>
<?
if($_GET["kw"]!='' && $_GET["kw"]!=NULL){
$sw = $_GET["kw"];
}else{
exit;
}
echo "查询<b>".$sw."</b><br>";
$filename = "www.csdn.net.sql";
date_default_timezone_set("PRC");
echo "开始时间:".date("Y-m-d H:i:s")."<br>";
if($TheFile = fopen($filename, "r")){
$i = 0;
$j = 0;
while(!feof($TheFile))
{
$line = fgetss($TheFile,255);
if(strpos($line,$sw) != NULL){
$line = preg_replace("/($sw)/i","<font color='red'><b>\\1</b></font>", $line);
echo "第".$i."行:".$line."<br>";
$j++;
}
$i++;
}

if(!fclose($TheFile)){
echo "关闭文件句柄失败!";
}

if($j>0){
echo "<font color='#22FF22'>共有".$j."条记录!</font><br>";
}else{
echo "<font color='red'><没有查到:".$sw."</font><br>";
}
}
echo "结束时间:".date("Y-m-d H:i:s")."<br>";

?>
</body>
</html>

实验结果:





平均时间大概:15秒

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: