crossorigin匿名无法加载图像的问题

时间:2016-01-16 12:05:11

标签: javascript html image cors cross-domain

参考:Prevent HTTP Basic Authentication from displaying prompt for images

为了保护我的用户生成的内容免受此潜在“漏洞利用”的影响,我向所有crossorigin="anonymous" BBC代码添加了[img]

嗯,它在IE11中有效:当我测试漏洞利用时,图像不再触发身份验证对话框(已通过禁用缓存和不同的URL进行测试以获得良好的衡量标准)。

但是在Chrome中,漏洞利用不起作用......因为根本没有加载图片。相反,我得到了显然相当常见的错误:

  

来自“XXXXX”的图像已被跨源资源共享策略阻止加载:请求的资源上没有“Access-Control-Allow-Origin”标头。因此,不允许原点'YYYYY'进入。

也许我的理解是错误的,但我认为该属性的"anonymous"值可以让它发挥作用。

我错过了什么,如果有的话还有什么其他选择来防止这个问题?

2 个答案:

答案 0 :(得分:13)

首先,根据我的理解,你的意思是说图片并没有在IE中加载。哪个是完美的!这就是它必须如何运作。

其次(& finally),Chrome的行为也很完美。

<强>进程/细节:

服务器不向原始站点提供凭据(通过将Access-Control-Allow-Origin设置为匿名),图像将被污染并且其使用受到限制。

现在,如果你有一个cross-origin image,你可以将它复制到画布中但是这个&#34; taints&#34;阻止你阅读它的画布(所以你不能&#34;偷&#34;或&#34;下载&#34;图像)。但是,通过使用CORS,存储图像的服务器可以告诉浏览器允许跨源访问,因此您可以通过画布访问图像数据。

当标头不是来自同一个源时,即,如果在没有CORS请求的情况下获取资源(即没有发送Origin:HTTP标头),并且因为它变得无效,那么它就像处理枚举关键字一样处理使用匿名。

所以我的猜测是null无论是不存在还是无效,在这种情况下它会被处理为匿名

所以,你看到Chrome中的错误意味着正在做IE正在做的事情。

一些可以提供帮助的参考资料

虽然不是直接的答案,但是,有用的链接 -

希望它有所帮助! :)快乐的编码!

答案 1 :(得分:1)

根据我的研究,

  

首先,你是什么意思Tainted canvas:

     

虽然您可以在画布中使用未经CORS批准的图像,   这样做会玷污画布。一旦画布被污染,你就不能   更长的拉出数据从画布中退出。例如,你不能   更长时间使用canvas toBlob(),toDataURL()或getImageData()   方法;这样做会引发安全错误   参考:https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image

     

CORS设置属性:

     

在HTML5中,一些HTML元素提供对CORS的支持,例如   imgvideo具有crossorigin属性(crossOrigin属性),   它允许您为获取的元素配置CORS请求   数据。默认情况下(即未指定属性时),CORS   完全没有使用。
  &#34;匿名&#34;关键字意味着会有   不能通过cookie,客户端SSL交换用户凭证   证书或HTTP身份验证

由于您链接的图片未启用CORS,因此您收到Access-Control-Allow-Origin错误。

要解决此问题,不仅需要发送crossOrigin属性,还需要发送正确的标头。您可以将此设置为crossOrigin设置为use-credentials,它设置凭据请求标头 - 服务器可以使用该标头来决定您是否拥有该内容的权限。当从服务器发回CORS头以获取图像,并且该图像在画布上使用时,origin-clean标志为true。