Asp.net 针对非表单post请求的CSRF保护

Asp.net 针对非表单post请求的CSRF保护,asp.net,csrf,Asp.net,Csrf,在隐藏的表单字段中实现CSRF令牌是对表单post请求的CSRF的标准保护 但是,对于GET请求,您将如何实现这一点?或者ajax请求为请求体发布json数据而不是x-www-form-urlencoded?这些类型的事情是否都是根据具体情况临时处理的?关于CSRF和GET请求: 理想的解决方案是在POST请求中只包含CSRF令牌 并将状态更改为“仅影响”的服务器端操作修改为 回复POST请求。这实际上是RFC2616所要求的 用于获取请求。如果保证执行敏感的服务器端操作 只回复POST请求,则

在隐藏的表单字段中实现CSRF令牌是对表单post请求的CSRF的标准保护

但是,对于GET请求,您将如何实现这一点?或者ajax请求为请求体发布json数据而不是x-www-form-urlencoded?这些类型的事情是否都是根据具体情况临时处理的?

关于CSRF和GET请求:

理想的解决方案是在POST请求中只包含CSRF令牌 并将状态更改为“仅影响”的服务器端操作修改为 回复POST请求。这实际上是RFC2616所要求的 用于获取请求。如果保证执行敏感的服务器端操作 只回复POST请求,则无需包括 GET请求中的令牌

此外,OWASP注意到:

此控件的许多实现在中包括质询令牌 获取(URL)请求[…],而此控件确实有助于降低风险 在CSRF攻击中,为GET公开了唯一的每会话令牌 请求。GET请求中的CSRF令牌可能在以下位置泄漏: 几个位置:浏览器历史记录、HTTP日志文件、网络设备 指向记录HTTP请求的第一行,以及 如果受保护的站点链接到外部站点,则引用者标题

这里的问题是,如果用户的令牌泄漏,您仍然很容易受到攻击,而且很容易泄漏令牌。我不确定你的问题是否有一个好的答案,不包括将所有GET请求转换为POST请求

值得注意的是,ASP.NET WebForms中的Viewstate功能确实提供了一些针对CSRF的保护,事实上,它也只保护回发请求

为了更简单地说明这一点,您不应该使用GET请求作为任何函数的入口点,这些函数除了返回只读资源供浏览器渲染外,还可以执行其他操作。因此,不要让AJAX脚本对像
transferMoney.aspx?fromact=xyz&toAcct=abc&amount=20这样的URL进行基于GET的调用

HTTP规范要求HTTP GET请求不应有副作用。尽可能保留GET请求被认为是最佳实践


我写过关于保护ASP.NET MVC免受CSRF影响的文章,它详细说明了一种实用的方法,可以将
AntiForgeryToken
应用于站点上的POST控制器方法。

这取决于您应用的CSRF保护模式。首先,CSRF应用于改变状态的端点。如果您收到更改状态的请求,那么我建议您将其修改为POST。话虽如此,这一点是正确的

保存令牌的理想位置是AUTH头。这是表单POST、AJAX和GET请求的最低公分母。当然,您可以将令牌存储在Cookie中,但是当应用于多域站点时,此设计中存在漏洞

您可以在FORM-POST期间从隐藏字段解析令牌,而不会出现问题。改变这一点没有多大意义。假设您的GET请求是通过AJAX调用的,您可以利用JQuery的ajaxSetup方法在每个AJAX请求上自动插入令牌:

$.ajaxSetup({
        beforeSend: function(xhr) {
            xhr.setRequestHeader("Authorization", "TOKEN " + myToken);
        }
    });
有一种相对较新的模式正在获得关注,称为加密令牌模式。它被详细地描述了,也在官方网站上。还有一个名为的工作实现,它可以为您提供各种类型的请求所需的灵活性