Javascript csrf同一原产地政策不适用';不能阻止阅读反应? 问题:
我在localhost:3000上运行以下代码,在localhost:8020上运行api。如果我访问localhost:3000,则会向localhost:8020/user/refresh发出请求,以使用cookie中的刷新令牌获取新的访问令牌,并使用新的访问令牌进行响应。我现在可以使用获取的访问令牌向localhost发出另一个请求:8020/user/delete 但是为什么我能够以攻击者的身份读取第一个请求的响应呢。同源策略是否应该禁止读取响应,因为我有不同的端口?是因为我允许originlocalhost:3000通过“访问控制允许Origin:localhost:3000”发出跨站点请求吗 如果访问控制允许来源是问题所在,我是否必须使用csrf令牌保护我的api请求,或者是否有其他方法?实现csrf令牌不是问题,但我想知道是否有不同的、可能更小的解决方案Javascript csrf同一原产地政策不适用';不能阻止阅读反应? 问题:,javascript,xmlhttprequest,csrf,Javascript,Xmlhttprequest,Csrf,我在localhost:3000上运行以下代码,在localhost:8020上运行api。如果我访问localhost:3000,则会向localhost:8020/user/refresh发出请求,以使用cookie中的刷新令牌获取新的访问令牌,并使用新的访问令牌进行响应。我现在可以使用获取的访问令牌向localhost发出另一个请求:8020/user/delete 但是为什么我能够以攻击者的身份读取第一个请求的响应呢。同源策略是否应该禁止读取响应,因为我有不同的端口?是因为我允许orig
<script>
function post() {
var x = new XMLHttpRequest();
x.open("GET", "http://localhost:8020/user/refresh", true);
x.withCredentials = true;
x.setRequestHeader("Content-Type", "application/json");
x.onreadystatechange = function () {
if (x.readyState == XMLHttpRequest.DONE) {
var data = JSON.parse(x.responseText);
var x2 = new XMLHttpRequest();
x2.open("POST", "http://localhost:8020/user/delete", true);
x2.setRequestHeader("Content-Type", "application/json");
x2.setRequestHeader("Authorization", `Bearer ${data["data"]["accessToken"]}`);
x2.onreadystatechange = function () {
if (x2.readyState == XMLHttpRequest.DONE) {
console.log(x2.responseText);
}
}
x2.send(JSON.stringify({user : { "id": "2" }}));
}
}
x.send(null);
}
</script>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body onload="post()">
</body>
</html>
职能职位(){
var x=新的XMLHttpRequest();
x、 打开(“获取”http://localhost:8020/user/refresh“,对);
x、 withCredentials=true;
x、 setRequestHeader(“内容类型”、“应用程序/json”);
x、 onreadystatechange=函数(){
if(x.readyState==XMLHttpRequest.DONE){
var data=JSON.parse(x.responseText);
var x2=新的XMLHttpRequest();
x2.打开(“POST”http://localhost:8020/user/delete“,对);
x2.setRequestHeader(“内容类型”、“应用程序/json”);
x2.setRequestHeader(“授权”,`Bearer${data[“data”][“accessToken”]}`);
x2.onreadystatechange=函数(){
if(x2.readyState==XMLHttpRequest.DONE){
console.log(x2.responseText);
}
}
send(JSON.stringify({user:{“id”:“2”}});
}
}
x、 发送(空);
}
解决方案
但是为什么我能够以攻击者的身份读取第一个请求的响应呢。同源策略是否应该禁止读取响应,因为我有不同的端口?是因为我允许originlocalhost:3000通过“访问控制允许Origin:localhost:3000”发出跨站点请求吗
是,“访问控制允许来源:localhost:3000”允许localhost:3000读取响应
如果访问控制允许来源是问题所在,我是否必须使用csrf令牌保护我的api请求,或者是否有其他方法?实现csrf令牌不是问题,但我想知道是否有不同的、可能更小的解决方案
<script>
function post() {
var x = new XMLHttpRequest();
x.open("GET", "http://localhost:8020/user/refresh", true);
x.withCredentials = true;
x.setRequestHeader("Content-Type", "application/json");
x.onreadystatechange = function () {
if (x.readyState == XMLHttpRequest.DONE) {
var data = JSON.parse(x.responseText);
var x2 = new XMLHttpRequest();
x2.open("POST", "http://localhost:8020/user/delete", true);
x2.setRequestHeader("Content-Type", "application/json");
x2.setRequestHeader("Authorization", `Bearer ${data["data"]["accessToken"]}`);
x2.onreadystatechange = function () {
if (x2.readyState == XMLHttpRequest.DONE) {
console.log(x2.responseText);
}
}
x2.send(JSON.stringify({user : { "id": "2" }}));
}
}
x.send(null);
}
</script>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body onload="post()">
</body>
</html>
OWASP建议始终使用csrf令牌。所以我实现了csrf令牌
但是为什么我能够以攻击者的身份读取第一个请求的响应呢。同源策略是否应该禁止读取响应,因为我有不同的端口
默认情况下,是的
是因为我允许originlocalhost:3000通过“访问控制允许Origin:localhost:3000”发出跨站点请求吗
对。显式授予localhost:3000读取数据的权限可以让localhost:3000读取数据
如果访问控制允许来源是问题所在,我是否必须使用csrf令牌保护我的api请求,或者是否有其他方法
您使用什么方法来保护端点不受攻击者攻击在很大程度上取决于:
- 你想让谁停止做坏事
- 你想让那些人做什么
- 你想让别人做什么