img标签的HTML crossorigin属性

Zal*_*beg 9 html5 canvas cors

我试图了解如何使用img标记的crossorigin属性.我找不到一个好的例子(我发现的关于CORS启用的图像用JavaScript代码解释,因此我看不到img标签的crossorigin属性.

我猜错了,如果我理解错了,请纠正我的错误.

首先,可以编写下面的代码片段来绘制图像到画布:

<canvas id="canvas" width=400 height=400></canvas>
<br><br>
<img id="image" src="http://...." alt="" width="400" height="400">
<script>
function draw() {
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    var img = new Image();
    img.crossOrigin = "Anonymous";
    img.src = document.getElementById("image").value;
    context.drawImage(img, 40, 40);
}
</script>
Run Code Online (Sandbox Code Playgroud)

下面的代码是否等同于上面的代码?它不包含"img.crossOrigin",但在img标记中具有crossorigin属性.

<canvas id="canvas" width=400 height=400></canvas>
<br><br>
<img id="image" crossorigin="anonymous"src="http://...." alt="" width="400" height="400">
<script>
function draw() {
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    var img = new Image();
    img.src = document.getElementById("image").value;
    context.drawImage(img, 40, 40);
}
</script>
Run Code Online (Sandbox Code Playgroud)

说实话,我无法进行实验,因为我不知道哪个站点允许将其图像用作CORS.

我猜想,如果一个站点允许在画布中使用它的图像,如果CORS请求是匿名完成的,你可以在画布上绘制它,如果不是你不能在画布上绘制它,即使请求是匿名完成的(我是不确定我是不是在这里).因此,上述两个示例都必须匿名请求CORS.

你能说他们两个都一样吗?如果没有,你能解释一下为什么并给我一个使用带有img标签的crossorigin属性的例子吗?

mar*_*rkE 10

由于您使用#image元素作为图像的源,因此代码的两个版本大致相同.

但...

没有crossorigin="anonymous"img元素的版本可能仍会生成跨域违规.

这是因为图像最初加载到img元素中而没有将跨源标志设置为匿名.

javascript代码可能会使用img元素中图像的缓存版本,而不是尝试从http://重新加载它...

这意味着缓存的图像数据仍然会将画布污染为包含跨源内容.

BTW,代码中的语法错误:

// Not:  img.src = document.getElementById("image").value;

img.src = document.getElementById("image").src;
Run Code Online (Sandbox Code Playgroud)

  • drawImage始终有效,因为它正在写入画布.恶意代码尝试使用.toDataURL和.getImageData等画布方法进行读取.所以:写==安全,阅读==您的银行帐户现在是空的.;-) (2认同)