在隐藏表单字段中实施CSRF令牌是表单发布请求的CSRF的标准保护。
但是,您如何为GET请求实现此功能?或者ajax为请求体请求POST json数据而不是x-www-form-urlencoded?这些类型的事情是否都是根据具体情况进行处理的?
答案 0 :(得分:1)
OWASP says this关于CSRF和GET请求:
理想的解决方案是仅在POST请求中包含CSRF令牌 并修改仅具有状态更改影响的服务器端操作 响应POST请求。这实际上是RFC 2616所要求的 对于GET请求。如果保证敏感的服务器端操作 只有响应POST请求,才有必要包含 GET请求中的令牌。
此外,OWASP指出:
此控件的许多实现都包含挑战令牌 GET(URL)请求[...] ,而此控件确实有助于降低风险 在CSR攻击中,为GET公开了唯一的每会话令牌 请求即可。 GET请求中的CSRF令牌可能会被泄露 几个位置:浏览器历史记录,HTTP日志文件,网络设备 指出要记录HTTP请求的第一行,以及 如果受保护站点链接到外部站点,则为Referrer标头。
这里的问题是,如果用户的令牌泄露,你仍然容易受到攻击 - 而且泄露令牌太容易了。我不确定你的问题有一个很好的答案,不涉及将所有这些GET请求转换为POST请求。
值得注意的是,ASP.NET WebForms中的Viewstate功能确实提供了一些针对CSRF的保护,though it's very limited - 事实上,它也只保护POSTback请求。
为了更简单地说明这一点,你不应该使用GET请求作为任何函数的入口点,这些函数除了返回浏览器要呈现的只读资源之外还执行某些操作。因此,没有AJAX脚本对transferMoney.aspx?fromAcct=xyz&toAcct=abc&amount=20
之类的URL进行基于GET的调用。
HTTP GET请求的HTTP规范states explicitly不应该有副作用。尽可能保留您的GET请求idempotent是最佳做法。
我已经编写了an article关于保护ASP.NET MVC免受CSRF攻击的问题,它阐明了将AntiForgeryToken
应用于您网站上的POST控制器方法的实用方法。
答案 1 :(得分:0)
这取决于您正在应用的CSRF保护模式。首先,CSRF适用于更改状态的端点。如果您是GET请求更改状态,那么我建议您将它们修改为POST。话虽如此,这是一个有效的观点。
持久标记的理想位置是在AUTH标题中。这是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的工作实现,它可以为您提供各种类型请求所需的灵活性。