首页 文章

CSRF保护非表格发布请求

提问于
浏览
0

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

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

2 回答

  • 1

    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的调用 .

    HTTP GET请求的HTTP规范states explicitly不应该有副作用 . 尽可能保持GET请求idempotent是最佳做法 .

    我写了关于保护ASP.NET MVC免受CSRF攻击的an article,它阐明了在您的站点上将 AntiForgeryToken 应用于POST控制器方法的实用方法 .

  • 0

    这取决于您正在应用的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的工作实现,它可以为您提供各种类型请求所需的灵活性 .

相关问题