CORS跨域限制以及预请求验证

之前我们可以通过“Access-Control-Allow-Origin”,实现跨域请求,那是不是所有跨域请求都可以通过设置Access-Control-Allow-Origin实现跨域请求呢?显然不是,它也会有一些限制
//server.js
const http = require('http');
const fs = require('fs');

http.createServer(function(req,res){
  console.log('req come', req.url);
  const html = fs.readFileSync('test.html', 'utf8');
  res.writeHead(200,{
    'Content-Type': 'text/html'
  })
  res.end(html);
}).listen(8888);

console.log('server listening on 8888');
console.log('http://localhost:8888/')

  

//server2.js
const http = require('http');

http.createServer(function(req,res){
  console.log('req come', req.url);
  res.writeHead(200, {
    'Access-Control-Allow-Origin': '*'
  })
  res.end('345');
}).listen(8887);

console.log('server listening on 8887');
console.log('http://localhost:8887/')

 

<!--test.html-->
<body>
<script>
fetch('http://localhost:8887/',{
  method:'post',
  headers:{
    'X-Test-Cors':'123'
  }
})
</script>
</body>

 

启动服务,运行server.js,请求8887,发现报错了,而且报错信息跟之前也会有点不一样,提示‘X-Test-Cors’,这个头信息在跨域里面是不被允许的,这就是今天要讲的cors跨域限制

 

一、跨域请求里面允许的方法
get
head
post
其它都是不允许的,比如put,delete等,浏览器预请求里面是做了验证的,

 

二、允许的Content-Type
text/plain
multipart/form-data
application/x-www-form-urlencoded
其它的content-type也需要经过预请求验证过才能发送

 

三、其他限制
请求头限制:比如刚才的自定义请求头,其他允许的请求头(https://fetch.spec.whatwg.org/#cors-safelisted-request-header)
XMLHttpRequestUpload对象均没有注册任何事件监听器
请求中没有使用ReadableStream对象



四、什么是预请求
刚才的请求是有返回值的,但是报错了,忽略了这个值,要不忽略这个值,需要在返回值里面允许这个自定义的头信息
// server2.js
const http = require('http');
http.createServer(function(req,res){
  console.log('req come', req.url);
  res.writeHead(200, {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Headers': 'X-Test-Cors',
    //'Access-Control-Allow-Methods': 'post,put,delete',
    //'Access-Control-Max-Age': "1000", //1000秒内不用再次发送预请求来验证,直接发起正式的请求就可以
  })
  res.end('345');
}).listen(8887);
console.log('server listening on 8887');
console.log('http://localhost:8887/')

 

这样设置,这个请求就成功了,但是可以观测到多了一个请求,这个多出来的请求就是预请求,告诉浏览器,这个自定义请求是允许的,然后再正式的发送这个请求,通过验证之后就请求成功了,浏览器为什么要做这些限制,是因为保证安全,不允许随便一个人都可以进行跨域

 

转载于:https://www.cnblogs.com/wzndkj/p/10056563.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CORS资源共享)是一种机制,允许网页从不同的访问其资源。但是,CORS也可能导致一些安全问题,例如请求伪造攻击(CSRF)和站脚本攻击(XSS)。因此,为了修复CORS漏洞,可以采取以下措施: 1. 限制Origin头:在服务器端,可以通过检查Request Header中的Origin头来判断请求是否来自可信。如果请求的Origin头不在可信列表中,则返回错误响应。 2. 使用Access-Control-Allow-Origin头:在服务器端,可以设置Access-Control-Allow-Origin头为允许访问的名列表,以控制哪些可以访问资源。 3. 使用Access-Control-Allow-Credentials头:如果需要在请求中使用cookie等凭证信息,则需要设置Access-Control-Allow-Credentials头为true,并在客户端设置withCredentials为true。 4. 限制请求方法:在服务器端,可以限制请求方法,以防止恶意请求。例如,只允许使用GET和POST方法。 5. 验证请求的来源:在服务器端,可以验证请求的来源,以确保请求来自可信的源。例如,可以检查Referer头或者使用Captcha等验证技术。 6. 使用安全的Cookie:在客户端,可以使用HttpOnly和Secure属性来保护cookie,以防止被窃取或篡改。 7. 定期更新软件:CORS漏洞通常是由于软件版本过旧或存在未修复的漏洞导致的。因此,定期更新软件是非常重要的。 以上是一些修复CORS漏洞的建议。除此之外,还需要对应用程序进行全面的安全测试,以确保没有其他漏洞存在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值