【问题标题】:Why is crossorigin attribute necessary to load images into a canvas and render it?为什么将图像加载到画布并渲染它需要 crossorigin 属性?
【发布时间】:2020-08-27 16:15:36
【问题描述】:

当通过将src 属性设置为Canvas 并尝试在画布上调用toDataURL() 来加载Image 时,只有在加载前设置crossorigin 属性时才允许这样做Image

这是为什么呢?如果图像具有正确的 Allow-Access-Control-Origin 标头。是不是因为在通过 URL 加载 Image 时没有使用 Origin 属性(即仅在设置了 crossorigin 属性时才包含 Origin 标头)?

【问题讨论】:

标签: javascript html5-canvas cors frontend same-origin-policy


【解决方案1】:

因为图像通常用于加载任意用户定义的内容,而图像数据只是打开了另一个向量,例如,该向量可用于隐藏可执行代码,稍后可以对其进行解码以绕过 XSS 过滤器。 ImageData 和 OffscreenCanvas 可以跨帧传递给工作人员。
并且实际上没有任何有效的用例允许从元素中检索任意图像数据,而无需明确请求,只需一个简单的属性。 (特别是当它可以被渲染时)
我认为问题应该是,为什么默认允许它?

更不用说为 cors 列入白名单(未污染)的资源保留书面记录的开销,因为您可以将它们默认列入黑名单。


基本上告诉浏览器是否应该使用 CORS 请求,以及预期的标头。具体是否发送和期望凭据。

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-crossorigin

跨域 指示是否必须使用 CORS 来获取图像。启用 CORS 的图像可以在元素中重复使用,而不会被“污染”。允许值:

匿名 执行了一个跨域请求(即带有 Origin HTTP 标头),但没有发送凭据(即没有 cookie、X.509 证书或 HTTP 基本身份验证)。如果服务器不向源站提供凭据(通过不设置 Access-Control-Allow-Origin HTTP 标头),图像将被污染并限制其使用。

使用凭据 一个跨域请求(即带有 Origin HTTP 标头)与发送的凭据(即 cookie、证书或 HTTP 基本身份验证)一起执行 /强>。 如果服务器不向源站提供凭据(通过 Access-Control-Allow-Credentials HTTP 标头),图像将被污染并限制其使用。

如果该属性不存在,则在没有 CORS 请求的情况下获取资源(即,不发送 Origin HTTP 标头),防止其在元素中的非污染使用。如果值无效,则按使用匿名值处理。有关更多信息,请参阅 CORS 设置属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多