我试图通过使用webrequests更改村名。原始的webrequest是:
http://ts9.travian.com/ajax.php?cmd=changeVillageName
POST /ajax.php?cmd=changeVillageName HTTP/1.1
Host: ts9.travian.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/javascript, text/html, application/xml, text/xml, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
X-Request: JSON
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Referer: http://ts9.travian.com/dorf1.php
Content-Length: 99
Cookie: sess_id=d6785b074b551c8f2bcdc31b7a314f9a; lowRes=0; T3E=jICvjEyjMlS3JAfAnZu%2FEA%3D%3D%3A6RoqZtSC3svl61Vi9hEBmO7xA0%2FJdL6xESd3tTKjvKM2UqoAiTf93aHbstIjJ0a7Yvf4c7vtp05Z4Kqm8Sg8OsJjM6waVRalUUKZWnU0fKHLqbvUcksUYSz2TKqMjhIgx8c6A9KRKyIvfdPOX7FffQ%3D%3D%3AP9Wn2BVlp9KeMlaOfyuG3ulblfv4%2BGhsswiIWeG5BNA%3D;travian_toggle=hero%3Aexpanded%2Cinfobox%3Aexpanded%2Cvillagelist%3Acollapsed; highlightsToggle=true
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
cmd=changeVillageName&name=SWAAGGERs%20village&did=39020&ajaxToken=6697441f78fefc90ca84c0e3891661cb
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 08 Dec 2014 10:31:54 GMT
Content-Type: application/json; charset=UTF-8;
Transfer-Encoding: chunked
Connection: keep-alive
回复是:
{
ajaxToken: null,
response: {"error":true,"errorMsg":"Token invalid","data":{"html":""}}
}
我发布请求的方式:
POST @ http://ts9.travian.com/ajax.php?cmd=changeVillageName
Data @ cmd=changeVillageName&name=ogdgpvqxf479&did=39020&ajaxToken=da56a3af2fc3cb6b629a091533d09e4e
REF @ http://ts9.travian.com/dorf1.php
是否有遗漏的东西? (如果我需要发布更多像cookie一样的数据,我可以在需要时这样做)
ajaxToken存储在javascript中的window.ajaxToken中,但随每个请求一起发送。
将ajaxtoken设置在顶部的每个页面中<script type="text/javascript">
window.ajaxToken = '4bf2392b506df3ebb1f4873a66f766d6';
</script>
编辑: 我已经在我的浏览器中欺骗了我的这些webrequests所使用的cookie,并且我已经能够这样做了......仍然没有找出导致它的原因。
答案 0 :(得分:0)
登录会话通过cookie保存。因此,如果没有cookie,服务器将无法确定将HTTP请求与哪个帐户相关联,以及该用户是否经过身份验证以更改给定村庄的名称。如果Web服务器没有这样做,您就可以更改服务器上任何村庄的名称。
window.ajaxToken JavaScript变量(这不是任何标准,只是这个特定网站所做的事情)用于阻止cross site request forgery。它也被称为CSRF令牌。
Web服务器为具有CSRF令牌的页面提供服务,但也将该CSRF令牌存储在服务器上并将其与当前登录会话相关联。每当服务器收到一个AJAX请求时,它就会使用cookie识别登录会话,并通过检查CSRF令牌来验证请求来自它所服务的页面。
如果他们不这样做,其他网站可能会在您不知情的情况下更改您的村庄名称。
假设我想通过命名你的村庄来禁止你“我使用机器人和宏。”在我的网站getbannedfromtravian.com上,我有这样的JavaScript:
$.post({
url: "http://ts9.travian.com/ajax.php?cmd=changeVillageName",
data: {
cmd=changeVillageName,
did=12345,
name="I use bots and macros"
}
});
当您访问我的网站时,此JavaScript将会运行。您的浏览器将非常友好地提供与ts9.travian.com关联的cookie,包括您的登录会话,以及请求。
但是,因为我没有提供服务器与登录会话关联并在每个页面中提供服务的CSRF令牌,所以它知道此请求不是来自它所服务的页面,而是应该忽略它,使您的村庄名称保持不变。