在我的网站上,我将一个隐藏字段放入一个随机值,我也同时将该值存储在Session中。提交表单时,我确保提交的值与会话值匹配。
这对CSRF保护是否足够?任何黑客攻击网站以强迫用户不知不觉地发布到我的网站的人都不知道我生成的CSRF令牌是什么,因此他们的攻击将失败。获取该令牌的唯一方法是向服务器发出GET请求,并将cookie解压缩并发布。
这可能吗?或者换句话说,您是否必须包含cookie作为CSRF保护的一部分?我在这里没有看到它:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet#Disclosure_of_Token_in_URL
除了“双提交cookie”部分。
答案 0 :(得分:2)
是的,这足以实现CSRF保护。为了获得最大程度的保护,请确保每次发出请求时隐藏的随机值(CSRF令牌)都会更改。
通常建议使用Cookie,因为它们易于使用,并且大多数Web框架都有内置的便捷方式来使用它们。
答案 1 :(得分:0)
一般来说,这是一个很好的方法。
您希望检查会话固定预防的互动。当用户登录(或通过其他方式更改其会话的权限级别,例如更改用户,新帐户或通过密码重置隐式登录)时,您应该丢弃旧的会话存储的反对-CSRF令牌并生成一个新令牌。
这样,如果攻击者设法对您的应用程序进行会话固定攻击,他们将无法使用它进入会话,等待您登录,然后CSRF您。当然,你应该确保会话固定无论如何都不会发生,但这是一个有用的防御深度测量。 (特别是因为一些潜在的会话固定路由,例如来自易受攻击的邻居域的cookie注入,可能会作为开发人员无法控制。)
这通常很简单,因为在权限级别更改时,您应该已经使会话标识符无效并重新发布,以阻止会话固定攻击获得对帐户的完全访问权限。虽然您正忙着这样做,但也要更改CSRF令牌。
(但是,无需为每个请求重新生成CSRF令牌,正如一些指南所建议的那样 - 这将使您的应用程序易于导航和使用多个标签。)