画布toDataURL用于上传文件在同一域上引发安全性错误

问题描述 投票:0回答:2

因此,您可以通过文件输入选择图像,所选图像文件被转换为window.url.createobjecturl并传递给未修改的隐藏“ img”元素,然后将图像元素的当前数据预览呈现为画布元素。到目前为止,一切都很好。但是当我尝试渲染canvas.toDataURL时,我不断收到关于它不安全的严重安全异常。这发生在Chrome和Firefox。

了解这是使用html INPUT元素选择的文件对象,而不是通过“ file://” url选择的,并且该网页是实际的网页,并且是通过“ http://”而不是通过通过“ file://”。

图像文件甚至还没有离开浏览器进入服务器,因此应该没有任何域问题。它只是一个原始斑点,被声明为图像的来源,然后告诉画布更新其预览。之后,尝试保存画布内容时,浏览器将触发错误。

我已经阅读了有关canvas元素被污染的场景的所有规范,并且此场景不满足任何这些场景。

[我已经在mozilla演示中看到了一个类似的示例,其中有人提供了代码片段来向人们展示如何做同样的事情,但是我还没有看到是否有人对此有问题。

任何想法? TIA

===更新===

好的,我已经知道了问题所在,但是我仍然不清楚为什么会出现问题。这是设置:

1)页面通过例如“ example.com/”]进行调用

2)脚本通过以下方式调用:“ r.example.com/script.js”

3)如果脚本从“ r.example.com”加载了任何图像以供页面设计使用,而不是画布使用,则它会污染整个页面。在这种情况下,我通过javascript绘制了整个页面,因此标题图片会污染页面的其余部分。如果我将标题图像更改为来自“ example.com”而不是“ r.example.com”,则画布上的问题就变得不安全了,一切都很好。

我不知道为什么会这样。标题图片是从与javascript文件相同的位置加载的,并且出于参数考虑,我什至将主域和子域的access-control-allow-origin都设置为“ *”,差异。

因此,访问控制可从任何位置进行,标头图像与javascript文件位于同一位置,并且未将其绘制到画布(即用户文件)上,所以为什么要通过javascript绘制标头图像污染与它无关的画布???同样,css和其他媒体是从同一子域加载的,但这不会影响页面,只要脚本未加载它们[o_0]。

我想将所有资源都放在一个单独的子域中以实现可伸缩性,因此,此问题令人沮丧,因为我不太明白为什么它仍在发生……

所以您通过文件输入选择图像,所选图像文件被转换为window.url.createobjecturl并传递给未修改的隐藏“ img”元素,然后预览图像...

javascript html security canvas
2个回答
1
投票

如果您希望图像位于单独的子域中,则必须更改图像的来源以允许所有子域都这样:


0
投票

似乎您必须在图像对象本身上设置此属性,因为它最初没有域[o_0]

© www.soinside.com 2019 - 2024. All rights reserved.