Travian 更改村庄名称会通过 webrequests 给出“无效令牌”
Posted
技术标签:
【中文标题】Travian 更改村庄名称会通过 webrequests 给出“无效令牌”【英文标题】:Travian changing village name gives 'Invalid Token' with webrequests 【发布时间】:2015-02-06 01:47:55 【问题描述】: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>
编辑: 我已经在我的浏览器中欺骗了这些网络请求使用的 cookie,并且我能够做到这一点......仍然没有弄清楚是什么原因造成的。
【问题讨论】:
【参考方案1】:登录会话通过 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 令牌,所以它知道这个请求不是来自它所服务的页面,应该忽略它,让你的村庄的名称保持不变。
【讨论】:
以上是关于Travian 更改村庄名称会通过 webrequests 给出“无效令牌”的主要内容,如果未能解决你的问题,请参考以下文章