关于跨站点脚本伪造

时间:2018-09-04 02:27:28

标签: spring spring-security csrf csrf-protection

我正在使用csrf并使用spring5。Spring 5自动为csrf提供支持,并在我得到的服务器端启用csrf保护

403: Invalid X-CSRF token

这意味着令牌需要来自前端吗?

我的理解是,后端生成csrf令牌并作为响应发送到前端浏览器,然后它使用此令牌并将其作为cookie发送到后端服务器,然后后端将对其进行验证。我的理解是正确的吗?

手动为csrf生成隐藏令牌时,后端如何知道它是有效的csrf令牌?

第二种情况:假设有两个用户登录到我的网站,并且前端将这个令牌发送到后端,那么应用程序将如何区分哪个令牌是针对哪个用户的?

还请解释一下它是如何内部工作的,这意味着我们在后端启用了csrf保护,并在前端手动生成了令牌,然后令牌在后台进行了什么操作?

考虑我的前端是JS页面

Spring 5是否有任何特色可以照顾每个用户的会话并自动为每个用户验证令牌?我尝试在官方网站上找到它,但没有找到它

1 个答案:

答案 0 :(得分:0)

嗨Zaib,您所声明的csrf令牌是从后端生成的,一旦生成,就会自动发送到前端,前端必须注意从模型中检索并针对每个“ POST”请求重新发布。 您可以通过其他方式(通常我使用标头或html参数)来共享csrf令牌。

令牌与特定会话相关,因此,无论您是否有登录用户,令牌都不是很重要,即使未经身份验证的用户也必须发送用于“ POST”的csrf令牌。

csrf令牌通过位于Spring安全性本身定义的过滤器链前面的过滤器进行验证,如果您在文档中进行搜索,则会有一个表格显示您通过Spring安全性启用的每个“默认”过滤器的位置。此外,如果在Spring上启用调试(在XML配置中使用</debug>就足够了),那么您将打印处理http请求时使用的所有过滤器。 因此,每次使用“ POST”方法的请求通过该过滤器时,它都会检查参数中是否包含csrf令牌或标头。

我从来没有用作cookie,因此如果您特别需要,它可能会与您不同,但是在工作方式上没有什么不同。

这是在Spring上实现csrf的详细信息: https://docs.spring.io/spring-security/site/docs/5.0.7.RELEASE/reference/htmlsingle/#csrf-configure

我说的是“ POST”方法,但实际上会检查令牌中是否有任何与状态更改有关的方法,您可以在此处参考doc: https://docs.spring.io/spring-security/site/docs/4.2.5.RELEASE/apidocs/org/springframework/security/web/csrf/CsrfFilter.html

希望这有助于澄清csrf令牌的用法。