【发布时间】:2013-12-17 20:00:07
【问题描述】:
首先,我知道当源图像来自另一个来源时访问画布的toDataURL 方法是一个安全问题。
但就我而言,我使用data: url 作为我的img 的来源,然后使用img 并将其绘制在canvas 上,然后调用canvas.toDataUrl。
这在 Chrome 和 Firefox 上运行良好,但在 IE 中失败并出现安全错误!
有什么想法吗?
...
var svgxml = getxmlsvg();
img.onload = function(){
canvas.drawImage(this, 0, 0);
canvas.toDataURL("image/png"); // <--- security error
}
image.src = URL.createObjectURL(new Blob([svgxml], {type: "image/svg+xml;charset=utf-8" }))
这是svgopen.org的引述
将数据从 SVG 传输到 Canvas 存在安全问题,这会导致 画布变为只写。我们认为这些问题可能是 避免使用我们的 SVG.toDataURL() 提案(“建议”部分)。
Same Origin 和 Canvas Origin 政策
网页由来自不同的不同元素组成 起源。来自同一来源的元素被认为是 安全 [Origin10]。
Canvas 具有强大的图像读写能力。它会 使用画布作为中间人将本地图像传输到 第三方只需从 file:// 将图像加载到 Canvas 元素中 -URL,然后使用 JavaScript 将像素数据从 Canvas 元素发送到任何主机。
为了防止 Canvas 的信息泄露,浏览器会小心 当图像数据的来源不是时保护 Canvas 的使用 安全的。所有 Canvas 元素都作为它们的 origin-clean 属性创建 设置为真。当任何可能被用于 使用 Canvas 元素传输违反同源的内容 策略,origin-clean 属性永久设置为 false。
If 方法返回存储在画布中的像素数据,例如 toDataURL() 或 getImageData(),在 Canvas 元素上调用 origin-clean 为 false,则引发 DOMException 18 SECURITY_ERR [画布10]。
但我正在浏览器中动态创建 SVG。
【问题讨论】:
-
听起来像是 IE 中的错误...这是什么版本的 IE?
-
我想是的,我使用的是 IE 11。我不记得正确但似乎是因为在画布上绘制 svg 图像使其成为
write-only!并防止进一步的读取操作!我已经更新了问题。 -
IE 具有时髦的隐私/安全级别,不一定与其他浏览器一致。在追查这是否是 IE 中的错误之前,请尝试将它们降低到最低限度
-
@Bakhshi:你读过你找到的整个文件吗?它似乎包含您正在寻找的答案:“SVG 可能包含来自多个来源的内容,并且浏览器倾向于将任何具有 MIME 类型 image/svg+xml 的内容列入黑名单作为多来源内容,甚至无需测试实际内容. […]" 虽然Webkit has been fixed 在此期间,IE 似乎仍然表现出这种行为
-
是的,你是对的@Bergi。似乎将我的 svg 呈现为 png 的唯一选择是
canvg,这是我试图避免的。
标签: javascript html internet-explorer canvas svg