关于跨站脚本伪造

Posted

技术标签:

【中文标题】关于跨站脚本伪造【英文标题】:Regarding Cross site Scripting Forgery 【发布时间】:2019-02-08 23:58:30 【问题描述】:

我正在研究 csrf 并使用 spring 5。Spring 5 自动提供对 csrf 的支持,并在服务器端启用 csrf 保护

403: Invalid X-CSRF token

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

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

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

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

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

假设我的前端是 JS 页面

Spring 5 是否有任何专长可以处理每个用户的会话并自动为每个用户验证令牌?去官网找了,没找到

【问题讨论】:

【参考方案1】:

您好 Zaib,如您所说,csrf 令牌是从后端生成的,一旦生成,它就会自动发送到前端,前端必须注意从模型中检索并重新发布每个“POST”请求。 您可以通过不同的方式共享 csrf 令牌,我主要使用 header 或 html 参数。

令牌与特定会话相关,因此是否有登录用户并不重要,即使未经过身份验证的用户也必须发送 csrf 令牌以进行“POST”。

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

我从未将其用作 cookie,因此如果您有特殊需要,它可能会有所不同,但它的工作方式并没有什么不同。

下面是在 Spring 上实现 csrf 的细节: https://docs.spring.io/spring-security/site/docs/5.0.7.RELEASE/reference/htmlsingle/#csrf-configure

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

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

【讨论】:

以上是关于关于跨站脚本伪造的主要内容,如果未能解决你的问题,请参考以下文章

学习跨站脚本伪造

CSRF跨站请求伪造与XSS跨域脚本攻击讨论

CSRF跨站请求伪造与XSS跨域脚本攻击讨论

DVWA之CSRF跨站脚本攻击

跨站请求伪造

跨站请求伪造