我通常在开发过程中添加*作为CORS allow origin标头,并想知道如果我使用csrf令牌来保护我的网站免受伪造请求,我是否还需要更改它。
答案 0 :(得分:0)
CSRF保护的基本案例是实际更改服务器上某些内容的请求。如果它只是一个不改变内容的GET,那么你很高兴,因为浏览器中的相同原始策略不允许攻击者网站创建对原始站点的请求(当然通过有效的登录用户的浏览器) 。因此,与GET保护相同的原始政策。
直到您添加access-control-allow-origin: *
。有了这个,恶意网站可以包含Javascript来从您的服务下载数据,并且能够访问响应 - 因为您允许它。
当然,如果有类似标题发送的令牌认证或类似的东西,这是不可能的,那么你很高兴。但问题是如果你有标准的CSRF保护,那么CORS标题中的*是否正常 - 不幸的是它不是。
答案 1 :(得分:0)
它绝对不安全。您正在规避相同的原产地政策。
一个具体的示例:您有一个网上商店和一个端点来更改用户银行帐户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。