在隐藏表单字段中实现CSRF令牌是表单发布请求的CSRF的标准保护 .
但是,您如何为GET请求实现此操作?或者ajax为请求体请求POST json数据而不是x-www-form-urlencoded?这些类型的东西是否都是根据具体情况进行处理的?
OWASP says this关于CSRF和GET请求:
理想的解决方案是仅在POST请求中包含CSRF令牌,并修改具有状态更改影响的服务器端操作,以仅响应POST请求 . 这实际上是RFC 2616对GET请求的要求 . 如果保证敏感的服务器端操作只响应POST请求,则不需要在GET请求中包含令牌 .
此外,OWASP指出:
此控件的许多实现包括GET(URL)请求中的质询令牌,而此控件确实有助于降低CSRF攻击的风险,为GET请求公开了唯一的每会话令牌 . GET请求中的CSRF令牌可能会泄漏到多个位置:浏览器历史记录,HTTP日志文件,指向记录HTTP请求第一行的网络设备,以及受保护站点链接到外部站点时的Referrer标头 .
这里的问题是,如果用户的令牌泄露,您仍然容易受到攻击 - 而且泄露令牌太容易了 . 我不确定你的问题有一个很好的答案,不涉及将所有这些GET请求转换为POST请求 .
值得注意的是,ASP.NET WebForms中的Viewstate功能确实提供了一些针对CSRF的保护,事实上,它也只保护了POSTback请求 .
为了更简单地说明这一点,你不应该让一个AJAX脚本对一个像 transferMoney.aspx?fromAcct=xyz&toAcct=abc&amount=20 这样的URL进行基于GET的调用 .
transferMoney.aspx?fromAcct=xyz&toAcct=abc&amount=20
HTTP GET请求的HTTP规范states explicitly不应该有副作用 . 尽可能保持GET请求idempotent是最佳做法 .
我写了关于保护ASP.NET MVC免受CSRF攻击的an article,它阐明了在您的站点上将 AntiForgeryToken 应用于POST控制器方法的实用方法 .
AntiForgeryToken
这取决于您正在应用的CSRF保护模式 . 首先,CSRF适用于 change state 的 endpoints . 如果您是GET请求更改状态,那么我建议您将它们修改为POST . 话虽如此,这是一个有效的观点 .
坚持Tokens的理想之处在于AUTH Header . 这是FORM-POST,AJAX和GET请求的最低标准 . 您当然可以将令牌存储在Cookie中,但是当应用于多域网站时,此设计中存在漏洞 .
您可以在FORM-POST期间从隐藏字段解析令牌而不会出现问题 . 改变这一点没什么意义 . 假设使用AJAX调用 GET 请求,您可以利用JQuery的 ajaxSetup 方法在每个AJAX请求上自动插入令牌:
$.ajaxSetup({ beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "TOKEN " + myToken); } });
有一种相对较新的模式正在获得称为加密令牌模式的牵引力 . 它详细描述了here,也在官方OWASP CSRF Cheat Sheet上 . 还有一个名为ARMOR的工作实现,它可以为您提供各种类型请求所需的灵活性 .
2 回答
OWASP says this关于CSRF和GET请求:
此外,OWASP指出:
这里的问题是,如果用户的令牌泄露,您仍然容易受到攻击 - 而且泄露令牌太容易了 . 我不确定你的问题有一个很好的答案,不涉及将所有这些GET请求转换为POST请求 .
值得注意的是,ASP.NET WebForms中的Viewstate功能确实提供了一些针对CSRF的保护,事实上,它也只保护了POSTback请求 .
为了更简单地说明这一点,你不应该让一个AJAX脚本对一个像
transferMoney.aspx?fromAcct=xyz&toAcct=abc&amount=20
这样的URL进行基于GET的调用 .HTTP GET请求的HTTP规范states explicitly不应该有副作用 . 尽可能保持GET请求idempotent是最佳做法 .
我写了关于保护ASP.NET MVC免受CSRF攻击的an article,它阐明了在您的站点上将
AntiForgeryToken
应用于POST控制器方法的实用方法 .这取决于您正在应用的CSRF保护模式 . 首先,CSRF适用于 change state 的 endpoints . 如果您是GET请求更改状态,那么我建议您将它们修改为POST . 话虽如此,这是一个有效的观点 .
坚持Tokens的理想之处在于AUTH Header . 这是FORM-POST,AJAX和GET请求的最低标准 . 您当然可以将令牌存储在Cookie中,但是当应用于多域网站时,此设计中存在漏洞 .
您可以在FORM-POST期间从隐藏字段解析令牌而不会出现问题 . 改变这一点没什么意义 . 假设使用AJAX调用 GET 请求,您可以利用JQuery的 ajaxSetup 方法在每个AJAX请求上自动插入令牌:
有一种相对较新的模式正在获得称为加密令牌模式的牵引力 . 它详细描述了here,也在官方OWASP CSRF Cheat Sheet上 . 还有一个名为ARMOR的工作实现,它可以为您提供各种类型请求所需的灵活性 .