2017-05-31 24 views
-1

我一直在阅读CSRF令牌如何实施以防止CSRF攻击。 OWASP页面(https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet)和各种文章声明,可以基于每个页面或每个会话生成一个随机唯一标记。 (其中他们建议每个会话生成一次)每个会话信息的CSRF令牌的实现

如果每个会话只生成一个令牌,那么这并不意味着每次使用该会话时使用令牌的所有表单页都必须具有相同的令牌被加载(每当说它被刷新)?但是在大多数实现中,我已经看到了表单的每个负载都有一个不同的随机标记。

它是如何工作的?在服务器端每次成功检查之后,会话中出现的CSRF令牌是否失效?

我只是想知道我是否理解这个权利。我在Stackoverflow和其他博客上阅读了许多类似的问题,但我仍然感到困惑。

谢谢!

回答

0

我没有看过OWASP页面,但我相信在这方面一个会话开始时访问者第一次到达一个网站,并继续进行,直到会话过期(无论是通过活动或其他一般服务器定义的标准)或访问者关闭浏览器。

当会话首次启动时,会话中不会出现CSRF令牌,因此服务器将生成一个令牌并将令牌存储在其内部数据中。将会话句柄返回给浏览器,并且当访问者加载或重新加载站点上的另一个页面时,它将会话句柄返回给服务器,服务器发现它已经设置了CSRF令牌,并使用现有句柄,而不是创建一个新的。因此,只要只有在会话中不存在已经存在的令牌时才创建新令牌,则无需担心令牌失效。

+0

那么这是否意味着如果我刷新包含表单的页面,每次直到会话中的令牌过期时令牌都会一样? – Kevin

+1

是的,只要您在请求页面时将所需的会话句柄传递给服务器。你在用什么语言?例如,在PHP中,您可以在页面代码的开头附近调用'session_start()'。第一次访问您的网站时,它不会有CRSF标记,因此您将它添加到'$ _SESSION'数组中。假设您的PHP是以常规方式设置的,则将cookie发送到包含会话ID的浏览器,并且浏览器会返回您网站上任何其他页面请求的cookie。然后,当你调用'session_start()'时,它将拥有你需要的CSRF令牌。 – FKEinternet

0

即使CSRF秘密只在每个会话中生成一次,也可以通过对发送给浏览器的秘密进行腌制和散列(类似于密码的腌制和散列)来获得不同的标记。在表单提交时,服务器可以验证盐渍令牌的密码(再次,类似于密码的检查方式)。这样,每个表单都可以获得自己的唯一标记,服务器不需要记住每个会话密钥以外的任何内容或使其失效。