0

我把Kunststube-CSRFP demo.php 放在我的服务器上:http://domain1.com/demo.php然后点击“TRY IT”按钮,它说:表单提交正常。

然后我查看源代码并将脚本生成的令牌复制到另一台服务器(domain2.com)并尝试在那里制作假 HTML 表单:

<form action="http://domain1.com/demo.php" method="POST">
<input type="hidden" value="1356266422:QaAnM2IolCk9K1Mme3rOGifwmfmdldzdyg/PBu4ht818lIu52ArKFG2HxUOztmcgwblLcIgymaNheuGY7g6Kg==:nvhnqxfM9upP/UT+FRGf0nXDILFPHaubfdjahVYSm2w9fFHKQ/bQQ6rapjdKN8ype9qaX8TkAZJpxg9RmH8ZM9YWA==" name="_token">
<input type="submit" value="Submit">
</form>

当我从 domain2.php 中点击“提交”按钮时......令人惊讶的是,第一台服务器 (domain1.com) 上的 demo.php 就像从其自身一样处理令牌并显示相同的字符串:表单提交正常。

不应该是“令牌无效。 ”如果不是从同一台服务器提交,就出来?我哪里做错了?谢谢!

4

2 回答 2

1

不应该是“令牌无效”。如果不是从同一台服务器提交,就出来?

不。

令牌的目的是防止 Mallory(控制恶意服务器)使 Alice 的 Web 浏览器向 Bob 的 Web 服务器提交不良数据。

在这种情况下,Alice 控制请求来自的服务器。Alice 是受信任的并且可以访问令牌。

爱丽丝可以提出她喜欢的任何要求。

然后我看源码

马洛里做不到。她无法获得令牌,因此她无法欺骗 Alice 没有提出 Mallory 想要提出的请求。

于 2012-12-23T13:06:22.690 回答
0

CSRF 是从第三方服务器向您的服务器提交表单数据,利用一个毫无戒心的用户登录到您的服务器的事实,并迫使他在用户无意的情况下在您的服务器上执行某些操作。

CSRF 令牌通过要求每个表单提交一个有效令牌来防止这种情况。没有用户的积极参与,第三方无法获得这些代币。因此,第三方可以从他们的站点向您的站点“伪造”表单提交,但他们不会拥有有效的 CSRF 令牌,这有助于您将此类虚假请求与真实请求区分开来。第三方无法获得此类令牌,​​因为浏览器中的 Javascript 跨站点脚本规则阻止浏览器从第三方站点获取数据(尽管它们不会阻止向第三方站点提交数据)。

这也是为什么您应该将令牌与用户 ID 绑定的原因。第三方可能能够从您的服务器获取有效令牌并将其包含在“假”表单中,但他们不应该能够获取用户特定的令牌。

如果你明确地给第三方令牌,你就是在颠覆你自己的 CSRF 保护。

于 2012-12-31T15:03:04.790 回答