Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以将通配符CORS与csrf令牌一起使用吗?_Cors_Csrf - Fatal编程技术网

可以将通配符CORS与csrf令牌一起使用吗?

可以将通配符CORS与csrf令牌一起使用吗?,cors,csrf,Cors,Csrf,我通常会在开发过程中添加*作为CORS allow origin标头,我想知道如果我使用csrf令牌来保护我的站点不受伪造请求的影响,我是否需要更改它。csrf保护的基本情况是请求实际上改变了服务器上的某些内容。如果只是一个无法改变内容的GET,那么您可以继续,因为浏览器中的同源策略不允许攻击者网站创建对原始站点的请求(当然是通过有效的登录用户浏览器)。因此,存在与GET保护相同的原产地政策 除非您添加访问控制允许源代码:,否则恶意网站可能包含Javascript从您的服务下载数据,并且能够访问

我通常会在开发过程中添加*作为CORS allow origin标头,我想知道如果我使用csrf令牌来保护我的站点不受伪造请求的影响,我是否需要更改它。

csrf保护的基本情况是请求实际上改变了服务器上的某些内容。如果只是一个无法改变内容的GET,那么您可以继续,因为浏览器中的同源策略不允许攻击者网站创建对原始站点的请求(当然是通过有效的登录用户浏览器)。因此,存在与GET保护相同的原产地政策

除非您添加
访问控制允许源代码:
,否则恶意网站可能包含Javascript从您的服务下载数据,并且能够访问响应,因为您允许它访问


当然,如果存在类似头发送令牌身份验证或类似的情况,因此这是不可能的,那么您就可以开始了。但问题是,如果您有标准的CSRF保护,CORS标题中的*是否可以-不幸的是,它不是。

它绝对不安全。您正在规避同一原产地政策。 一个具体的例子:你有一个webshop和一个端点来更改用户的银行帐户
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>

$(文档).ready(函数(){
csrf_令牌=document.cookie.match(“csrf-token”);
csrf_令牌=csrf_令牌[“输入”]。拆分(“=”[1];
$(“按钮”)。单击(函数(){
$.ajax({
url:“http://mycoolwebshop/api/v1/users/3/changebankdata",
类型:'POST',
contentType:“应用程序/json”,
xhrFields:{
证书:正确
},
数据:JSON.stringify({银行账户:“01234345”}),
数据类型:“json”,
标题:{
“CSRF-TOKEN”:CSRF_令牌
},
成功:函数(){
警报(“正常”);
},
错误:函数(jqXHR、textStatus、error){
//警报(文本状态);
}
});
});
});
这里的想法是从浏览器的cookie存储中读取cookie,并作为自定义HTML头附加。
但是,只有当CORS allow origin设置为*时,这才有效。

如果get请求也需要csrf令牌,这就足够了吗?(我正在开发一个API,所以不会有用户直接通过浏览器URL发起的请求)嗯,我会说大部分是的,但是考虑一些事情。URL参数记录在服务器和任何代理上(以及浏览器中,但您的意思是,预期的客户端将不是浏览器)。在复合攻击中,攻击者可能从这些来源获得有效令牌。如果是用户看到的URL,他们倾向于复制粘贴(但同样,在您的场景中,这不是一个有效点)。所以在你的情况下,我认为这不会是一个很大的风险,尽管这听起来有点奇怪我知道它破坏了REST,但是如果安全性很重要,我会考虑改变所有的内容,或者更好的是,如果客户端不是浏览器,为什么不发送令牌作为请求头呢?这是相当标准的,尤其是对于API,并且在安全的情况下,几乎适用于任何客户机。