在图像和脚本标记中。
我的理解是,您可以访问其他域上的脚本和图像。那么什么时候使用这个属性呢?
这是你想限制其他人访问你的脚本和图像的能力吗?
图片:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-交叉原点
脚本:
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script
可以在规范中找到答案。
对于img
:
crossorigin
属性是CORS设置属性。其目的是允许来自允许跨来源访问的第三方网站的图像与canvas
一起使用。
对于script
:
crossorigin
属性是CORS设置属性。对于从其他来源获得的脚本,它控制是否会暴露错误信息。
这就是我们在script
标签中成功使用crossorigin
属性的方式:
我们遇到的问题:我们试图使用window.onerror
在服务器中记录js错误
我们记录的几乎所有错误都有这样的消息:Script error.
,我们得到的关于如何解决这些js错误的信息很少。
原来chrome中的原生实现报告错误
if (securityOrigin()->canRequest(targetUrl)) {
message = errorMessage;
line = lineNumber;
sourceName = sourceURL;
} else {
message = "Script error.";
sourceName = String();
line = 0;
}
如果请求的静态资产违反了浏览器的同源策略,则将message
作为Script error.
发送。
在我们的案例中,我们是从cdn服务静态资产。
我们解决它的方法是将crossorigin
属性添加到script
标记中。
p.S.从这个答案中得到了所有信息
启用CORS的图像可以在元素中重复使用而不会受到污染。允许的值为:
该页面已经回答了您的问题。
如果你有一个跨来源的图像,你可以将其复制到画布中,但这会"污染"画布,从而阻止你阅读它(因此你不能"窃取"图像,例如从网站本身无法访问的intranet中)。然而,通过使用CORS,存储图像的服务器可以告诉浏览器允许跨原点访问,因此您可以通过画布访问图像数据。
MDN还有一个关于这件事的页面:https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
这是你想限制其他人访问你的脚本和图像的能力吗?
没有。
如果您正在本地开发一段快速代码,并且您正在使用Chrome,则会出现问题。如果您的页面使用表单的URL加载"file://xxxx",则尝试在画布上使用getImageData()将失败,并引发跨源安全错误,即使您的图像是从本地计算机上与呈现画布的HTML页面相同的目录中提取的
文件://D:/wwwwroot/mydir/mytestpage.html
并且您的Javascript文件和图像正在从中提取,例如:
文件://D:/wwwwroot/mydir/mycode.js
文件://D:/wwwwroot/mydir/myImage.png
然后,尽管这些辅助实体是从同一个来源提取的,但仍然会引发安全错误。
出于某种原因,Chrome没有正确设置原点,而是将必需实体的原点属性设置为"null",从而无法通过在浏览器中打开HTML页面并在本地调试来测试涉及getImageData()的代码。
同样,由于同样的原因,将图像的crossOrigin属性设置为"匿名"也不起作用。
我仍在努力寻找解决方法,但浏览器实现者似乎再次让本地调试变得尽可能痛苦。
我只是试着在Firefox中运行我的代码,通过识别我的图像与HTML和JS脚本来自同一个来源,Firefox做得很好。因此,我很欢迎关于如何在Chrome中解决这个问题的一些提示,因为目前,当Firefox工作时,它的调试器非常缓慢,甚至离拒绝服务攻击只有一步之遥。
我已经找到了如何说服Google Chrome允许file://references而不引发跨源错误。
步骤1:在其他操作系统中创建快捷方式(Windows)或等效快捷方式;
步骤2:将目标设置为类似以下内容:
"C:\Program Files(x86)\Google\Chrome\Application\Chrome.exe"--允许从文件访问文件
这个特殊的命令行参数--allow-file-access-from-files,告诉Chrome允许您使用对网页、图像等的file://references,而不会在每次尝试将这些图像传输到HTML画布时抛出交叉原点错误。它适用于我的Windows7设置,但值得一试,看看它是否也适用于Windows8/10和各种Linux发行版。如果是这样,问题就解决了——离线开发恢复正常。
现在,如果我试图将图像数据传输到画布或将JSON数据传输到表单元素,我可以引用file://URI中的图像和JSON数据,而不会出现Chrome引发的跨源错误。
-
默认情况下,脚本不受
same-origin policy
的约束,它可以从任何跨源域加载第三方JavaScript。 -
此类规则具有明显的安全风险,例如:
- 第三方JavaScript可以访问第一方网站的错误上下文,从而获取内部信息
- 第三方JavaScript源服务器可以通过请求时的SSL握手验证、cookie等方式获取用户信息
- 为了降低这些安全风险,浏览器为脚本标记引入了
crossorigin
属性
- 如果没有
crossorigin
属性,就不可能获得JavaScript的错误上下文 - 将
crossorigin
设置为"anonymous"
允许访问JavaScript的错误上下文,但在请求期间SSL握手中不携带cookie或用户凭据 - 将
crossorigin
设置为"use-credentials"
允许访问JavaScript的错误上下文,并在请求期间在SSL握手中携带cookie或用户凭据
此外,在2023年左右,Chrome浏览器的HTTP缓存也会受到
crossorigin
属性的影响,详细信息请参阅缓存控制头不起作用。