注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ㄨiao愛

转载技术文档

 
 
 

日志

 
 

基于PHP的可输入验证码和更换IP的刷票器实现  

2012-06-06 20:55:08|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

现在越来越多的活动采取网络投票的办法来进行一些票数统计和排名,为了防止恶意刷票的发生,往往对投票进行一些限制,如需要输入验证码,同一IP一天只能投限定票数的票等,但所谓道高一尺,魔高一丈,本文将完成一个基于PHP的刷票器程序,这个程序将可以将可完成验证码输入及更换IP的功能。

第一部分  网页分析及提交数据

    以某投票网站为例,假如其投票网址为

http://example.com/vote.php,页面显示为一些复选框,对应一些不同的选择目标,勾选后,然后填写页面下方的验证码,验证码为图片的形式出现,填写完成,点击投票按钮提交即完成一次投票过程,如果成功则返回成功投票信息,如果失败则返回失败的信息如验证码输入错误,过于频繁投票,IP一天只能投限定票数的信息等。

    首先分析网页源代码,先看一下目标选择框,网页选择框为checkbox,形如:

<input id="200" name="votedata[]" value="200" type="checkbox">

所有的checkbox都属于一个form, 如下:

<FORM form action="/vote.php" method="post" id="voteform"  name="voteform">

   再看一下投票按钮,投票按钮也属于这个form,类型为submit如下:

<input value="投票" name="dosubmit" type="submit">。

   再看一下填写验证码的输入框对应的代码为:

<input name="yzm" id="yzm" type…….

    最后看一下验证码到底是什么,验证码显示对应的代码为:

<img src="http://513394217.blog.163.com/blog/yanzhengma.php" id="yanzhengma" …>

    可以看出,此验证码是通过yanzhengma.php文件得到的,右击网页验证码位置,选择图片另存为选项,发现此图片为png格式。

    至此,我们所有需要的信息都已经得到,网页为一form, 选择复选框时,会votedata[]数组赋值为value,网站会从yanzhengma.php下载验证码图片,用户点击投票时,会通过post的方法将这些数据提交给vote.php网站,然后此php会分析提交的数据完成相应的回复过程, 在这里只要是代码中出现name的地方,在提交的数据中都要包含这个参数,参数对应的值就是代码中的value值。

    既然整个投票过程就是一个post的过程,现在就可以利用php+curl完成这个功能,curl为一个模拟获取和发送网页内容的php库,需要手工开启,在网络上有很多相关信息。

    需要注意的是,网站有可能保存cookies信息在本地,保存着用户和服务器session id的信息。提交信息的时候要注意将此session id 带上。

首先获取验证码和cookie并保存:

$url_yzm= 'http://example.com/yanzhengma.php';

$fp = fopen("yzm.png","wb");   //验证码文件

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url_yzm);

curl_setopt($curl, CURLOPT_HEADER, 0);    //不读取http头,因为只要得到图片数据即可。

curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt");                  //保存cookie

curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt");                   //读取cookie

$data = curl_exec($curl);        //得到图片数据

fwrite($fp, $data);       //保存

fclose($fp);


    此时验证码图片已经保存至本地,可以看到验证码的数值,假设为abcd。

   下面我们就可以模拟网页投票的post过程,假设你要投票的目标的复选框对应的value="100"的话,我们构造的要提交的数据就可以表示为:

$post_data = 'votedata='.urlencode(100).'&'.'yzm='.urlencode(‘abcd’).'&'.'dosubmit='.urlencode('投票');。

就可以提交此数据了:

$url_main=’ http://example.com/vote.php’;

curl_setopt($curl, CURLOPT_URL, $url_main);

curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt");            //设置cookie数据

curl_setopt($curl, CURLOPT_POST, 1);       //设置post模式

curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);//设置post数据

$data = curl_exec($curl); //提交数据

curl_close($curl);

    到此,一个投票过程就已经完成,如果想更智能的话,可以将验证码的分析也由程序完成,这在网上也有很多介绍。

第二部分   突破IP限制

    想要突破IP限制的话有两种方式,一种是使用代理,但代理不稳定,这里使用另一种方式,笔者所在网络为局域网,通过路由器PPPOE登陆的方式,路由器一般有重启的功能,重启后IP发生改变,这样再登录网站投票,你的IP就没有限制了,以后每次投票之前都可以通过重启路由器防止IP重复,路由器设置一般也是通过浏览器设置,也就是同样可以通过php+curl完成。以一款迅捷路由器为例说明如何设置。

路由器IP一般为192.168.1.1等,在浏览器中输入IP后需要用户名和密码,登录进去后有相应的设置,找到重启选项点击重启后就会发现连接公网的IP已经发送改变。

    通过查看网页代码发现重启路由器功能通过get方式完成,假设重启路由器网址为

$url_reboot = 'http://192.168.1.1/userRpm/SysRebootRpm.htm?Reboot=重启路由器';

重启代码如下:

    $ch = curl_init();

    curl_setopt($ch,CURLOPT_URL,$url_reboot);

    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 

    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);

    curl_setopt($ch,CURLOPT_USERPWD,"user:password");  //设置登录路由器用户名和密码

    $data=curl_exec($ch);

    curl_close($ch);

    要注意的是如果get的value为中文的话,中文编码方式要和网页本身的编码方式相同,否则get会失败。

510

  评论这张
 
阅读(1218)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017