Travian更改村庄名称时,webrequests给出“无效令牌”
我正在尝试通过使用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>
编辑:
我已经在浏览器中欺骗了这些Web请求所使用的cookie,并且就能够做到这一点...仍然不知道是什么原因造成的。
最佳答案
登录会话通过cookie保留。因此,如果没有Cookie,服务器将无法确定将HTTP请求与之关联的帐户,以及该用户是否已通过身份验证来更改给定村庄的名称。如果网络服务器没有执行此操作,则可以更改服务器上任何村庄的名称。
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令牌,因此它知道此请求并非来自它所服务的页面,因此应将其忽略,从而使您村庄的名称保持不变。