1、script标签 crossorigin 属性
script标签去请求资源的时候,request是没有origin头的。
script标签请求跨域资源的时候,内部运行如果报错的话,window.onerror 捕获的时候,内部的error.message只能看到Script error.看不到完整的错误内容。这个应该是浏览器的安全策略。
window.addEventListener('error', function(msg, url, lineno, colno, error) {
console.log('error catch:', msg.message);
return false
})
设置 crossorigin属性后
①、script标签去请求资源的时候,request会带上origin头,然后会要求服务器进行 cors校验,跨域的时候如果response header 没有 ‘Access-Control-Allow-Origin’ 是不会拿到资源的。cors验证通过后,拿到的script运行内部报错的话,window.onerror 捕获的时候,内部的error.message可以看到完整的错误信息。
crossorigin的属性值分为 anonymous和use-credentials。如果设置了crossorigin属性,但是属性值不正确的话,默认是anonymous。
②、anonymous代表同域会带上cookie,跨域则不带上cookie,相当于 fecth请求的credentials: 'same-origin'。
③、use-credentials跨域也会带上cookie,相当于fetch请求的 credentials: 'include',这种情况下跨域的response header 需要设置'Access-Control-Allow-Credentials' = true,否则cors失败。
2、integrity安全验证
引入远程文件存在一个问题,如果对应的文件被篡改了,那么可能会对用户造成影响。虽然cdn一般都是可靠的,但是不排除受到黑客的攻击。
integrity属性设置引入js文件的hash值,浏览器在下载js文件时候,会对js文件进行hash计算,如果一致则正常加载,否则拒绝加载运行。
生成hash值的工具地址
integrity="sha384-*****"
src="https://cdn.xxx.xx/js/index.js"></script>
总结
①、设置了crossorigin就相当于开启了cors校验。
②、开启cors校验之后,跨域的script资源在运行出错的时候,window.onerror可以捕获到完整的错误信息。
③、crossorigin=use-credentials可以跨域带上cookie。
④、integrity可以做远程文件安全验证