参考:Prevent HTTP Basic Authentication from displaying prompt for images
为了保护我的用户生成的内容免受此潜在“漏洞利用”的影响,我向所有crossorigin="anonymous"
BBC代码添加了[img]
。
嗯,它在IE11中有效:当我测试漏洞利用时,图像不再触发身份验证对话框(已通过禁用缓存和不同的URL进行测试以获得良好的衡量标准)。
但是在Chrome中,漏洞利用不起作用......因为根本没有加载图片。相反,我得到了显然相当常见的错误:
来自“XXXXX”的图像已被跨源资源共享策略阻止加载:请求的资源上没有“Access-Control-Allow-Origin”标头。因此,不允许原点'YYYYY'进入。
也许我的理解是错误的,但我认为该属性的"anonymous"
值可以让它发挥作用。
我错过了什么,如果有的话还有什么其他选择来防止这个问题?
答案 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的支持,例如
img
或video
具有crossorigin属性(crossOrigin属性), 它允许您为获取的元素配置CORS请求 数据。默认情况下(即未指定属性时),CORS 完全没有使用。
&#34;匿名&#34;关键字意味着会有 不能通过cookie,客户端SSL交换用户凭证 证书或HTTP身份验证
由于您链接的图片未启用CORS,因此您收到Access-Control-Allow-Origin
错误。
要解决此问题,不仅需要发送crossOrigin属性,还需要发送正确的标头。您可以将此设置为crossOrigin设置为use-credentials
,它设置凭据请求标头 - 服务器可以使用该标头来决定您是否拥有该内容的权限。当从服务器发回CORS头以获取图像,并且该图像在画布上使用时,origin-clean标志为true。