CSRF保护非表格发布请求

时间:2012-08-23 14:48:37

标签: asp.net csrf

在隐藏表单字段中实施CSRF令牌是表单发布请求的CSRF的标准保护。

但是,您如何为GET请求实现此功能?或者ajax为请求体请求POST json数据而不是x-www-form-urlencoded?这些类型的事情是否都是根据具体情况进行处理的?

2 个答案:

答案 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的工作实现,它可以为您提供各种类型请求所需的灵活性。