0%

解决canvas中获取跨域图片数据问题

为什么 canvas 认为跨域图片数据为 污染的数据

当请求跨域图片数据,而未满足跨域请求资源的条件时。如果canvas使用未经跨域允许的图片的原始数据,这些是不可信的数据,可能会暴露页面的数据。

请求图片资源 - 同域

Request Headers带有cookie。图片数据是被canvas信任的。

请求图片资源 - 跨域

默认情况下,直接请求跨域图片。因为不符合跨域请求资源的条件,图片数据是不被canvas信任的。

为了解决图片跨域资源共享的问题, 元素提供了支持的属性:crossOrigin,该属性一共有两个值可选:anonymous 和 use-credentials,下面列举了两者的使用场景,以及满足的条件。

(anonymous:匿名的)

anonymous use-credentials
用途 匿名请求跨域图片资源,不会发送证书(比如cookie等) 具名请求跨域图片资源,会携带证书数据
Request Headers origin origin、cookie
Response headers Access-Control-Allow-Origin Access-Control-Allow-Origin、Access-Control-Allow-Credentials
所需条件 Access-Control-Allow-Origin 字段值需要包含请求域。 Access-Control-Allow-Origin 字段值需要包含请求域,且不能为通配符 *。Access-Control-Allow-Credentials 字段值需要为 true,表明允许请求发送证书数据。
1
2
3
4
5
6
7
8
9
const canvas=document.createElement('canvas');
const context=canvas.getContext('2d');
const img=new Image();
img.crossOrigin='anonymous';
img.onload=()=>{
context.drawImage(this,0,0);
context.getImageData(0,0,img.width,img.height);
}
img.src="https://b.com/a.png"