【发布时间】:2016-09-30 07:07:30
【问题描述】:
我对网络安全还很陌生,当我阅读更多关于不同攻击媒介的信息时,我开始怀疑它们是被允许的。就好像 Web 设计时使用了损坏的安全模型并且容易受到攻击。
我也对大量模糊和不精确的信息感到惊讶。例如,起初 Single Origin Policy 听起来不错,然后我读到它只适用于 XHR,顺便说一句,它实际上并不能阻止 XHR 跨域 POST,这是经典的 CSRF 攻击。很高兴我一直在阅读。
还有一个 Origin 标头,服务器可以使用它来确保请求来自正确的位置——但是糟糕,它在浏览器之间的设置不一致,如果没有设置,你就不能完全正确确定是因为同源请求,还是某些浏览器无法获取的请求类型(可能是 IMG 标签?)。继续阅读。
所以正确的方式似乎是在会话cookie中设置一个CSRF令牌,并将该令牌添加到表单/链接中,然后在提交时比较它们的服务器端。理论上(为了这个问题,我们排除所有 XSS 攻击),来自另一个选项卡的 CSRF 尝试可能会向包含 cookie 的表单发出 POST 请求,但没有将表单输入元素设置为匹配的令牌(因为它无法从 cookie 中读取令牌),因此服务器将拒绝该请求。工作但很笨拙,并确保您永远不会忘记检查!
暂时记住这个想法,这是我的问题——为什么浏览器会在来自不是 cookie 来源的页面的请求中发送会话 cookie?
我的意思是,浏览器会出于充分的理由拒绝将 cookie 发送到不同的域,但很乐意将它们发送 来自不同的来源?如果他们不这样做,东西会破裂吗?它会不会是针对 CSRF 的强大防御,只要求服务器做他们正在做的事情——检查有效的会话 cookie?
编辑:也许这是为了改善这种情况? https://datatracker.ietf.org/doc/html/draft-west-origin-cookies-01
【问题讨论】:
-
很多东西都会坏掉。例如所有这些分析和广告脚本。
-
浏览器并不是从一开始就设计为允许 CSRF发生的。 CSRF 是后来发现的,当时已经有很多网站了。肯定不止十个。事后更改规则并期望每个网站都进行更改以适应规则更改是期望很高的-尤其是当很多跨站点请求可能没有有害影响时,只有理想的。
-
这有点无关紧要。网站有责任保护自己,而不是依赖“正确”设计/开发/维护的浏览器。这就是为什么 CSRF 令牌(即使是笨拙的)是必要的。我建议将 CSRF 构建到网站架构中(或使用已有的框架)。这样,它总是在那里并且总是被检查(假设你正确使用了框架;)
-
@LaJmOn 需要保护的不是用户,而不是网站吗?并且用户希望他们的浏览器通过保护他们来自一个站点的 cookie 免受来自另一个站点的请求来保护他们?就像它希望浏览器也以许多其他方式保护它们一样。
-
这篇文章比较老了,但只想说——太棒了!
标签: security web csrf csrf-protection