【问题标题】:Purpose of the crossorigin attribute...?跨域属性的目的...?
【发布时间】:2013-08-22 14:33:52
【问题描述】:

在图像和脚本标签中。

我的理解是您可以访问其他域上的脚本和图像。那么什么时候使用这个属性呢?

这是您想要限制其他人访问您的脚本和图像的能力吗?

图片:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-crossorigin

脚本:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script

【问题讨论】:

    标签: html cross-domain


    【解决方案1】:

    我发现了如何说服 Google Chrome 允许 file:// 引用而不引发跨域错误。

    第 1 步:创建快捷方式 (Windows) 或其他操作系统中的等效项;

    第 2 步:将目标设置为如下所示:

    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files

    那个特殊的命令行参数 --allow-file-access-from-files 告诉 Chrome 让你使用 file:// 对网页、图像等的引用,而不会在你每次尝试时抛出跨域错误例如,将这些图像传输到 HTML 画布。它适用于我的 Windows 7 设置,但值得检查它是否也适用于 Windows 8/10 和各种 Linux 发行版。如果是这样,问题就解决了——离线开发恢复正常。

    现在我可以从 file:// URI 引用图像和 JSON 数据,如果我尝试将图像数据传输到画布或将 JSON 数据传输到表单元素,Chrome 不会抛出跨域错误。

    【讨论】:

      【解决方案2】:

      如果您正在本地开发一段快速代码,并且您使用的是 Chrome,就会出现问题。如果您的页面使用“file://xxxx”形式的 URL 加载,则尝试在画布上使用 getImageData() 将失败,并引发跨域安全错误,即使您的图像是从相同的本地计算机上的目录作为呈现画布的 HTML 页面。因此,如果您的 HTML 页面是从中获取的,请说:

      file://D:/wwwroot/mydir/mytestpage.html

      您的 Javascript 文件和图像正在从中获取,例如:

      file://D:/wwwroot/mydir/mycode.js

      file://D:/wwwroot/mydir/myImage.png

      那么尽管这些辅助实体是从同一来源获取的,但仍然会引发安全错误。

      由于某种原因,Chrome 没有正确设置原点,而是将必需实体的原点属性设置为“null”,导致无法仅通过在浏览器中打开 HTML 页面并在本地调试来测试涉及 getImageData() 的代码.

      此外,出于同样的原因,将图像的 crossOrigin 属性设置为“匿名”也不起作用。

      我仍在尝试为此寻找解决方法,但再一次,浏览器实现者似乎使本地调试变得尽可能痛苦。

      我刚刚尝试在 Firefox 中运行我的代码,并且 Firefox 通过识别我的图像与 HTML 和 JS 脚本来自相同的来源而做对了。所以我欢迎一些关于如何在 Chrome 中解决问题的提示,因为目前,虽然 Firefox 可以工作,但它的调试器 痛苦地 很慢,以至于从拒绝中删除了一步服务攻击。

      【讨论】:

      • 谢谢,这个答案让我意识到我遇到的问题可能只会影响本地测试环境,确实如此。
      【解决方案3】:

      这就是我们成功在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;
      }
      

      如果请求的静态资源违反浏览器的same-origin policy,则将message 发送为Script error.

      在我们的例子中,我们从 cdn 提供静态资产。

      我们解决它的方法是将crossorigin 属性添加到script 标记中。

      附:从this answer获得所有信息

      【讨论】:

        【解决方案4】:

        答案可以在the specification找到。

        对于img

        crossorigin 属性是 CORS settings attribute。其目的是允许来自第三方站点的允许跨域访问的图像与canvas 一起使用。

        对于script

        crossorigin 属性是CORS settings attribute。控制从其他origins获取的脚本是否暴露错误信息。

        【讨论】:

        • 尽管名字相同,但它们似乎没有什么共同之处。一种是关于错误控制的,另一种是用于画布的。
        • @Smurfette:它们的共同点是,当从跨域来源使用时,它们会修改元素的工作方式。但是,是的,它们确实有很大不同。
        • @Smurfette:这与他们阻止您使用图像无关,只是阻止(或允许)您在canvas 元素中使用它们。
        • 仅供参考,此属性在链接元素中也很有用 - 当链接到 Firefox 中的外部样式表时(例如使用 Google 字体),这可以解决如果您有任何脚本访问文档时可能出现的问题。样式表
        • @Smurfette:iFrame 是否有这样的属性,以便我可以从服务器端控制 src,如果请求来自已知的 Origin 吗?
        【解决方案5】:

        启用 CORS 的图像可以在元素中重复使用而不会被污染。允许的值为:

        该页面已经回答了您的问题。

        如果您有一个跨域图像,您可以将其复制到画布中,但这会“污染”画布,阻止您阅读它(因此您不能“窃取”图像,例如从网站本身没有的 Intranet可使用)。但是,通过使用 CORS,存储图像的服务器可以告诉浏览器允许跨域访问,因此您可以通过画布访问图像数据。

        MDN 也有一个关于这件事的页面:https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image

        这是您想要限制其他人访问您的脚本和图像的能力吗?

        没有。

        【讨论】:

        • 我在我的问题中发布链接时读到了这一点。这对我来说毫无意义。这个问题很笼统,也包括脚本。
        • 我不认为这是否真的是问题的答案Purpose of the crossorigin attribute …?
        猜你喜欢
        • 2018-11-14
        • 2014-11-11
        • 2016-04-05
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多