zoukankan      html  css  js  c++  java
  • 关于投票系统的一些事儿

           现在网络投票很盛行。随之而来的问题就是刷票。我在不同投票网站中,总结一些程序员经常犯的一些小错误,这些小错误会导致更容易地被刷票。

           首先,我们以一个投票网站为例。

           http://bid.sise.cn/vote/xixing.html

          这个最近惹起争议的投票。

          首先我要先说一下他防止刷票的几个举措:

          1、使用了验证码。

          2、投票的来路验证。

          其实来路验证,用途不大。可以起到一定的防低级刷票的作用,但是个人感觉来路验证对于放刷票来说意义不大。

          而验证码,是最多用来防止自动投票的一个方法。但是我们可以通过验证码识别记录(ORC)进行破解。不过……此网站并不需要这样做。因为我们犯了一个简单的逻辑错误。首先我们看一下,验证码的机制。

    看上去万无一失的方法。将系统生产的文字,转换为图片,输出给客户端。在提交时,与系统生成的检验,我们就可以得出结果,是否人工输入。

    很多童鞋,第一次写验证码的时候会这样做判断

     

    if(session['code']==request['code']){
    //提交成功
    }else{
    //验证码失败
    }

    如果我们可以编写一个程序,直接绕过一个步骤,变成了以下的过程,不知道会产生什么问题?

    我们可以假设不请求getcode.asp。那么我们的系统session['code']就为null或""

     

    同样一样代码:  当session['code']==request['code']就成立了。当然,如果像asp.net这种强类型语言,由于没写入code代码会导致session['code']==null,会报错。可以使他失败。

    if(session['code']==request['code']){

    //提交成功

    }else{

    //验证码失败

    }

    这样子验证码变形同虚设。我们可以改一下代码就可以了。

    if(session['code'!= "" && session['code']==request['code']){
    //提交成功
    }else{
    //验证码失败
    }

    好了,其实这些很多童鞋都会知道,这样子的。但是这样就能防别人刷票了吗?错了,我们忽略了一点东西。Session可以随意转移到某一台机或IP,Session不是锁定IP,而是以一个Cookies值作为依据去服务器读取数据。

     

    继续是以上流程,如果我第一次可以用肉眼识别验证码,为ABCD。

    当判断结束,投票完毕后,我们的session['code']在其存活期中,依然是ABCD。

    按照以上理论,我们无论投票多少次,验证码依然是abcd,不过只是我们使用了不同代理,绕过了ip判断。

     

    如果按照这样子,当投票一次完毕后,清空验证码,那就可以避免这次小漏洞出现。

     

    if(session['code'!= "" && session['code']==request['code']){
    //提交成功
    session['code']=""
    }
    else{
    //验证码失败
    }

     

    你们懂这个怎样编写一个刷票程序了吗?保持session不变,只换代理,那么就可以绕过ip判断、绕过验证码判断。

    其实我们还可以看到一些更破的投票验证设施,比如我们最近的一个投票网站

    http://www.zyznc.com/ds/

     

    function getAJAXvote(id){ 
         S_xmlhttprequest();

             xmlHttp.open(
    "POST","voteAjax.php?act=vote&id="+id,true); 
             xmlHttp.onreadystatechange 
    = AJAXvote;//准备就绪
             xmlHttp.send(null);
    }
     
    function AJAXvote(){
         
    if(xmlHttp.readyState == 4){
              
    if(xmlHttp.status == 200){
                   
    var msg = xmlHttp.responseText;
                   
    var getstr=msg.split("|");
                   document.getElementById(
    "votespan"+getstr[1]).innerHTML="已有"+getstr[0]+"票 <a style=\"color:#999;\">投票</a>";
              }
          
         }
    }
     

    很多人喜欢用ajax投票,然后不加验证码。看上去很安全,其实更危险。

    我们很容易就知道了他的投票是通过Post,但是由于他php获取参数并不准确,以get传递亦可,于是,我们可以构造一个<img src="voteAjax.php?act=vote&id=xxx" />,然后作为头像等信息,让访问该页面时能直接做出一个投票的请求。这样可以进行一个大范围的投票,每一个访问网页的人都成为了一个刷票的工具。

    每一次使用完session忘记了清空或者是消灭掉,可能成为很多人编程的一个遗留处,虽然可以针对全自动广告工具,但却无法针对有针对性的刷票工具。

     当然,一个更完善的网络投票系统一直是我在研究。之前尝试过连接验证Mysise进行投票,这样可以阻止大部分的刷票和虚投现象。

    以上当然要防御和识别使用以上方法刷票也很简单。

    第一种,需要使用大量代理,会出现大量外国IP。已经非常可以。或者中间插入特殊输入变量记录,该用户是否有刷票。

    第二种,加一个来路验证,就完事,当然必须还是有验证码的。 

  • 相关阅读:
    windows服务的默认启动类型和登录帐户
    oracle通过sql随机取表中的10条记录
    oracle如何四舍五入?
    Sql Server数据库自增长字段标识列的插入或更新修改操作办法
    将一个表中的数据导入到另一张表中
    设计模式已经陨落了?
    LINQ架构简单描述
    Asp.Net 验证控件
    .Net 三层架构开发初步
    C++编程思想
  • 原文地址:https://www.cnblogs.com/pika/p/2040567.html
Copyright © 2011-2022 走看看