【问题标题】:Is it ok to use wildcard CORS with a csrf token?可以将通配符 CORS 与 csrf 令牌一起使用吗?
【发布时间】:2018-04-26 03:06:41
【问题描述】:

我通常在开发过程中添加 * 作为 CORS 允许的原始标头,并且想知道如果我使用 csrf 令牌来保护我的网站免受伪造请求,我是否必须更改它。

【问题讨论】:

    标签: cors csrf


    【解决方案1】:

    它绝对不安全。您正在规避同源政策。 一个具体的例子:您有一个网店和一个端点来更改用户的银行帐户http://mycoolwebshop/api/v1/users/3/changebankdata 可以通过 Ajax POST 请求调用此端点。在每个请求中,您都将 csrf 令牌附加为 HTTP 标头。

    攻击者可以伪造一个恶意请求,当受害者单击攻击者网站上的按钮时发送该请求:

    <html>
    <body>
    <script src="https://code.jquery.com/jquery.js"></script>
    <!-- Latest compiled and minified JavaScript -->
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    <script type="text/javascript">
        $( document ).ready(function() {
                csrf_token = document.cookie.match("CSRF-TOKEN");
                csrf_token = csrf_token["input"].split("=")[1];
            $("button").click(function(){
                $.ajax({
                url: "http://mycoolwebshop/api/v1/users/3/changebankdata",
                type:'POST',
                contentType: "application/json",
                xhrFields: {
                    withCredentials: true
                    },
                    data: JSON.stringify({ Bank-Account: "01234345" }),
                dataType: "json",
                 headers: {
                    "CSRF-TOKEN":csrf_token
                    },
                success: function(){
                    alert("ok");
                },
                error: function(jqXHR, textStatus, error){
                    //alert(textStatus);
                }
            });
        });
    });
    </script>
    
    <button></button>
    

    这里的想法是从浏览器的 cookie 存储中读取 cookie,并将其作为自定义 HTML 标头附加。 但是,这仅在 如果 CORS 允许来源设置为 * 否则 SOP doesn't allow custom request headers from cross domains 时有效。

    【讨论】:

      【解决方案2】:

      CSRF 保护的基本情况是实际更改服务器上某些内容的请求。如果它只是一个不改变内容的 GET,那么你很高兴,因为浏览器中的同源策略将不允许攻击者网站创建对原始站点的请求(当然,通过有效的登录用户浏览器) .所以有与 GET 保护相同的源策略。

      直到您添加access-control-allow-origin: *这样,恶意网站可以包含 Javascript 以从您的服务下载数据,并且能够访问响应 - 因为您允许它。 p>

      当然,如果有类似标头发送令牌身份验证或类似的东西,所以这是不可能的,那么你很高兴。但问题是,如果你有标准的 CSRF 保护,CORS 标头中的 * 是否可以 - 不幸的是它不是。

      【讨论】:

      • 如果我也需要 csrf 令牌来获取请求就足够了吗? (我正在开发一个api,所以不会有用户直接通过浏览器url发起的请求)
      • 嗯,我会说大部分是肯定的,但请考虑一些事情。 URL 参数会记录在服务器和任何代理上(以及在浏览器中,但您是说预期的客户端不会是浏览器)。攻击者有可能在复合攻击中从这些来源获取有效令牌。如果它是用户看到的 URL,他们倾向于复制粘贴(但同样,这在您的场景中不是一个有效点)。所以在你的情况下,我认为这不会是一个巨大的风险,即使这对我来说听起来有点奇怪。 :) 我知道它会破坏 REST,但如果它对安全性至关重要,我会考虑将所有内容更改为 POST。
      • 或者更好的是,如果客户端不是浏览器,为什么不将令牌作为请求头发送呢?这是相当标准的,尤其是对于 API,并且几乎适用于任何客户端,同时又是安全的。
      猜你喜欢
      • 2014-09-01
      • 2015-03-27
      • 2011-09-07
      • 1970-01-01
      • 2012-09-04
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多