关于 CORS 的基础知识在 MDN上有很详细的描述HTTP访问控制(CORS)和可能会有的隐患。CORS机制及其风险
不过有一点需要注意,跨域的请求,最终是会被目标服务器当作一个正常的请求处理,只是浏览器拦截了返回结果。
A页面里有一个ajax请求访问B服务的接口,B服务没有设置 Access-Control-Allow-Origin
这个header。
查看B的 nginx 的 access_log 还是可以看到请求被正确处理,返回200状态码。
192.168.10.1 - - [18/Aug/2019:17:12:36 +0800] "GET /test HTTP/1.1" 200 40 "http://a.test/test.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
经过测试发现:如果将设置 withCredentials 为 true,浏览器会携带上cookie
请求目标服务器,服务器正常处理和相应。
<script>
$.ajaxSetup({xhrFields: {withCredentials: true}});
$.get('http://b.test/test',[], function (data) {
alert(data);
});
</script>
也就是说你可以在A页面携带上B的身份凭证数据去搞事情。除非A页面是在自己可以控制的浏览器(App 内置浏览器),那样就可以拦截B服务器返回的数据包。不过A都已经在自己的App了,想玩啥不行?