在隐藏字段中添加反 CSRF 令牌真的可以防止 CSRF 攻击吗? [复制]

Posted

技术标签:

【中文标题】在隐藏字段中添加反 CSRF 令牌真的可以防止 CSRF 攻击吗? [复制]【英文标题】:Does adding anti CSRF token in hidden field really protect against CSRF attacks? [duplicate] 【发布时间】:2020-06-11 04:26:24 【问题描述】:

如果攻击者可以读取隐藏字段,那么在隐藏字段中发送反 CSRF 令牌有何用处?

我正在准备面试时遇到了 CSRF。我知道 CSRF 是可能的,因为每当我们的浏览器向我们登录的网站发送请求时,它也会自动发送 cookie。为了让真实服务器知道用户是否真的发出了请求,this article 建议应该在浏览器发送的每个请求中添加一个反 CSRF 令牌作为隐藏值。这样真实服务器就会知道哪个请求是伪造的,哪个不是伪造的,因为攻击者无法预测反 CSRF 令牌。

但是this post 表示攻击者可以很容易地看到隐藏的值。这难道不会使上述建议的缓解措施毫无用处吗?我很困惑。

【问题讨论】:

【参考方案1】:

上下文和对细节的关注很重要。

对于初学者来说,Web security, are there issues with hidden fields (no sensitive data)? 的答案并不是说攻击者可以“轻松”看到隐藏的值,而是说它与查看查询字符串参数“一样容易”——这是比较的,而不是绝对的.

然后你必须考虑攻击者是谁。讨论隐藏字段与查询参数意味着简单地隐藏用户不应该看到的值 - 攻击者是访问页面的普通用户。 另一方面,CSRF,在最一般的情况下,涉及第三方诱骗用户提交表单;攻击者是第三方并且(除非存在其他漏洞)不能仅仅读取用户的数据。

最后,您链接的博客文章中描述的保护技术不仅仅依赖于隐藏字段,而是将其与存储在 cookie 中的令牌结合在一起——这被称为双重提交 Cookie 模式,是一种教科书 CSRF 保护机制。攻击者需要匹配 both 表单和 cookie 令牌才能成功执行攻击。

是的,博文中概述的解决方案确实可以防止 CSRF 攻击。

【讨论】:

以上是关于在隐藏字段中添加反 CSRF 令牌真的可以防止 CSRF 攻击吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

一个令牌与多个令牌以防止 CSRF 攻击

我可以使用 JWT 作为反 CSRF 令牌吗

在没有表格的情况下获取 Codeigniter CSRF 令牌?

何时需要使用令牌保护表单(CSRF 攻击)?

页面中所有表单的 Laravel 5 CSRF 全局令牌隐藏字段

PHP CSRF 表单令牌 + 验证建议