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

IE throws Security Error when calling toDataUrl on canvas

提问人:Bakhshi 提问时间:12/2/2013 最后编辑:Bakhshi 更新时间:11/9/2017 访问量:9815

问:

首先,我知道当画布的源图像来自另一个来源时访问画布的方法是一个安全问题。toDataURL

但就我而言,我使用 url 作为我的源,然后使用并绘制它,然后调用 .data:imgimgcanvascanvas.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 存在安全问题,这会导致 Canvas 变为只写。我们认为这些问题可能是 我们的 SVG.toDataURL() 提案(“建议”部分)避免了这一点。

同源和画布源策略

网页由来自不同 起源。来自同一来源的元素被认为是 安全 [Origin10]。

Canvas 具有强大的图像读写能力。它会的 使用 canvas 作为中间人将本地图像传输到 第三方只需将图像从 file:// 加载到 Canvas 元素中即可 -URL,然后使用 JavaScript 将像素数据从 Canvas 元素发送到任何主机。

为了防止 Canvas 的信息泄露,浏览器会小心翼翼 当图像数据的来源不是 安全。所有 Canvas 元素都创建为其 origin-clean 属性 设置为 true。当任何可能用于 使用 Canvas 元素传输违反同一来源的内容 策略中,origin-clean 属性永久设置为 false。

如果方法返回存储在 canvas 中的像素数据,例如 toDataURL() 或 getImageData() 在 Canvas 元素上调用,其 origin-clean 为 false,则引发 DOMException 18 SECURITY_ERR [帆布10]。

但是我正在浏览器中即时创建 SVG。

JavaScript HTML 互联网浏览器 画布 SVG

评论

1赞 12/4/2013
在我看来,这听起来像是IE中的一个错误......这是什么版本的IE?
0赞 Bakhshi 12/5/2013
我想是的,我正在使用 IE 11。我记错了,但似乎是因为在画布上绘制 svg 图像使它!并防止进一步的读取操作!!我已经更新了问题。write-only
0赞 CrayonViolent 12/5/2013
IE具有时髦的隐私/安全级别,不一定与其他浏览器一致。尝试将它们降低到最低限度,然后再追究它是否是 IE 中的错误
4赞 Bergi 12/5/2013
@Bakhshi:你读过你找到的整个文件吗?它似乎包含您正在寻找的答案:“SVG 可能包含来自多个来源的内容,浏览器倾向于将任何 MIME 类型为 image/svg+xml 的内容列入黑名单,作为多来源内容,甚至不测试实际内容。[...]”虽然 Webkit 已经修复了一段时间,但 IE 似乎仍然显示出这种行为
1赞 Bakhshi 12/5/2013
是的,你是对的@Bergi.似乎将我的 svg 渲染为 png 的唯一选择是我试图避免的。canvg

答:

1赞 Gary Wolfe 2/16/2015 #1

就我而言,我将构成图像的图形元素从 svg 更改为 png。使用 svg 时,当我使用 toDataURL 时,我在 IE 11(和 10)而不是 Chrome 中看到安全错误。使用 png 元素构建图形,这很好。

在 IE 11 中,svg 无法正确调整大小存在第二个问题,因此这是对在 IE 中使用 svg 的又一次打击。

评论

0赞 Lucky 8/8/2016
有没有解决办法?面临从 svg 获取数据 uri png 的相同问题。
1赞 chwagssd 10/5/2016 #2

有一个库可以抽象 svg --> canvas --> png 并向 SVG 元素添加一个方法,以便在任何浏览器中,您都可以使用回调和选项“canvg”调用 mySvg.toDataUrl():

https://github.com/sampumon/SVG.toDataURL

此实现考虑了安全异常,因此您可以绕过遇到的权限错误。

<script type="text/javascript" src="http://canvg.github.io/canvg/rgbcolor.js"></script> 
<script type="text/javascript" src="http://canvg.github.io/canvg/StackBlur.js"></script>
<script type="text/javascript" src="http://canvg.github.io/canvg/canvg.js"></script> 
<script>
<script type="text/javascript" src="http://rawgit.com/sampumon/SVG.toDataURL/master/svg_todataurl.js"></script>

mySVGelement.toDataURL("image/png", {
  renderer: "canvg"
  callback: function(data) {
      image.src = data;
  }
});
</script>

兼容性

Browser     E x p o r t i n g  f o r m a t
            SVG+XML  PNG/canvg  PNG/native
IE           9+       9+         -
Chrome       +        +          33+ ²
Safari       +        +          -
Firefox      +        +          11+ ¹
Opera        +        +          -

评论

0赞 keremispirli 10/24/2018
不适用于 IE11。我在这里试过:sampumon.github.io/SVG.toDataURL/butterfly_test.html