关于 CSRF 的问题

Posted

技术标签:

【中文标题】关于 CSRF 的问题【英文标题】:Questions about CSRF 【发布时间】:2012-03-26 19:09:04 【问题描述】:

在 cookie 中使用信号 auth-token 进行身份验证是否安全(仅通过 ajax 发布和请求 json)?

为什么攻击者无法在隐藏字段中获取表单令牌?

攻击者如何通过 POST 请求进行 CSRF 攻击?

【问题讨论】:

请澄清您的第一个问题。 【参考方案1】:

在 cookie 中使用单个令牌进行身份验证是否安全?

有点,如果该 cookie 是仅 HTTP(有助于防止 XSS)和 SSL,那么您网站之外的任何人都无法读取该 cookie。

但是,用户的浏览器可以保留该 cookie,并在其浏览器再次向您的应用程序请求页面时自动发送该 cookie。当用户浏览您的网站时,这是需要的,但 CSRF 攻击是如何可能的。

为什么攻击者无法在隐藏字段中获取表单令牌?

在 CSRF 攻击中,黑客实际上无法读取您的网站或 cookie,因为它应该受到 SSL/HTTPS 的保护。 CSRF 的工作原理是欺骗您的浏览器,将他们的数据连同您的安全数据一起发送到您的网站。

因此,隐藏字段中的值是针对 CSRF 的默认防御的一部分 - 它们在 cookie 中有一个秘密值(黑客可以欺骗浏览器重新发送但无法查看或编辑),并且相同加密页面中隐藏输入字段中的值(黑客无法访问)。如果 cookie 和隐藏的值不匹配,那么你就有了 CSRF 攻击。

攻击者如何通过 POST 请求进行 CSRF 攻击?

好的,假设您有一个安全的网站。您可以使用 SSL 登录此站点,您将获得一个仅用于 HTTP 的 SSL 身份验证 cookie,以保持您的登录状态。

现在我有一个新页面,位于一个完全不同的网站上。如果我从我的网站链接到您的网站,那么当您单击该链接时,它将离开我的网站并转到您的网站,并传递您的 cookie。

如果我将 html <form> 添加到我的页面并 POST 回您的网站,则会发生同样的事情:浏览器会返回您的网站并发送表单中的任何数据以及您的 cookie。

请注意,我没有读取您的 cookie 或您网站上的任何页面,因为它们都受 SSL 加密保护。

为了获得完整的效果,我可以在页面上隐藏该表单,这样用户甚至都不会意识到他们正在发回您的网站。

Facebook 上的“点赞”功能就是一个简单的例子——我想他们现在已经修复了这个问题,但有一段时间我可以欺骗您的浏览器(无需访问您的详细信息)将您的身份验证 cookie 发送到 Facebook 操作表示你喜欢我想让你喜欢的东西。

【讨论】:

以上是关于关于 CSRF 的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于Laravel CSRF 的问题求助

关于JSON CSRF的一些思考

关于csrf

关于Laravel CSRF 的问题求助

ruby 关于葡萄的CSRF

关于CSRF攻击及mvc中的解决方案 [ValidateAntiForgeryToken]