canvas.toDataURL() 导致安全错误

Posted

技术标签:

【中文标题】canvas.toDataURL() 导致安全错误【英文标题】:canvas.toDataURL() causing a security error 【发布时间】:2012-12-29 01:33:42 【问题描述】:

我正在通过KineticJS's .toDataURL() 方法使用 html5 画布和 .toDataURL() 函数。画布使用我的用户上传到站点的图像,这些图像存储在不同的机器和子域farm1.domain.com

问题:.toDataURL()被调用时,我得到了错误

SECURITY_ERR: DOM Exception 18 

有没有办法解决这个问题?如果用户通过domain.com 访问页面并且图像托管在www.domain.com,我也会遇到同样的问题。

尝试:

我在 virtualhost 中的httpd.conf 中添加了以下几行并重新启动了 apache 服务。

Header add Access-Control-Allow-Origin "http://www.domain.com"
Header add Access-Control-Allow-Origin "http://domain.com"
Header add Access-Control-Allow-Origin "http://farm1.domain.com"

domain.com 的页面访问托管在www.domain.com 上的图像时,我仍然遇到同样的错误!在 KineticJS 中有没有办法解决这个问题?

【问题讨论】:

可能重复:***.com/questions/9344548/… 和 ***.com/questions/2390232/… 重复并被回答,看右栏中的相关,这里是spec 我猜必须将 origin-clean 标志设置为 true 以避免错误?这可以在 KineticJS 中完成吗? 这似乎在 Chrome 45 中有效,我只在 Safari 9 中遇到问题 【参考方案1】:

没有办法解决这个错误。从不同域加载到画布中的图像将引发此错误,因为每个浏览器当前都已实现。在您的情况下,图像应该存储在同一个域中,并且您不会遇到异常。

【讨论】:

我无法将图像存储在其他服务器和 CDN 中,这真的很奇怪,尤其是当图像数量无法容纳在单个服务器中时...... @Nyxynyx 是的,不幸的是,这是画布元素的安全限制。【参考方案2】:

您需要将Access-Control-Allow-Origin 标头添加到您正在加载的图像中,而不是添加到正在加载它们的页面中。有关此标头以及一般 CORS 的详细信息,您可能需要阅读专门讨论此问题的“CORS isn't just for XHR”。

【讨论】:

以上是关于canvas.toDataURL() 导致安全错误的主要内容,如果未能解决你的问题,请参考以下文章

canvas.toDataURL() 在 IE 11 中给出“安全错误”

在画布上调用 toDataUrl 时 IE 引发安全错误

为啥 canvas.toDataURL() 会抛出安全异常?

canvas.toDataURL() 抛出安全异常,尽管图像是本地的

toDataURL() 中断 SSL 连接

canvas.toDataURL()报错