我有三个文件:
script.js
alert("script")
module.mjs
alert("module")
index . html和
<script src="./script.js"></script>
<script src="./module.mjs" type="module"></script>
没有服务器在运行
如果我打开浏览器并导航到我的本地index.html文件,我可以看到脚本警告正在显示,但模块被跨源策略阻止。
Chrome和Firefox都显示相同的行为,但我从本地环境访问所有文件,那么为什么他们说在一种情况下有跨源策略违反,而在另一种情况下没有?
部分原因可以在这里找到,但在我的情况下,script.js被加载,为什么跨源策略只应用于ES6模块?
支持无CORS的非模块的跨源脚本加载是向后兼容性的遗留特性。
来自规范开发期间的讨论:
web的基本安全模型是同源策略。我们在该安全之前,该规则是否存在一些遗留例外模型已经就位,脚本标签是最令人震惊的也是最危险的。(参见各种"JSONP"攻击。)
很多年前,也许是随着XHR或网页字体的引入记不清了),我们划清了界限,说没有新的Web平台特性将打破同源策略。现有的功能需要被继承并经过精心打磨还有经常被利用的例外,为了不破坏网络,但是我们肯定不能再给我们的安全政策增加任何漏洞了。
这就是为什么,从我们的角度来看,使模块脚本绕过CORS协议(以及同源策略)是不可能实现的。这是不是关于特定的攻击场景,除了已经有的经典脚本启用;这是关于确保新功能加入的平台也不会遭受过去糟糕的安全问题卫生。