【发布时间】:2011-06-08 01:01:27
【问题描述】:
我有一个在 pixie.strd6.com 上运行的站点和通过 Amazon S3 托管的图像,其 CNAME 为 images.pixie.strd6.com。
我希望能够将这些图像绘制到 HTML5 画布上并调用 getImageData 方法,但它会抛出 Error: SECURITY_ERR: DOM Exception 18
我试过设置window.domain = "pixie.strd6.com",但是没有效果。
另外,$.get("http://dev.pixie.strd6.com/sprites/8516/thumb.png?1293830982", function(data) {console.log(data)}) 也会抛出错误:XMLHttpRequest cannot load @987654321@. Origin @987654322@ is not allowed by Access-Control-Allow-Origin.
理想情况下,HTML5 画布不会阻止从子域调用 getImageData。我研究过在 S3 中设置 Access-Control-Allow-Origin 标头,但没有成功。
非常感谢任何帮助或解决方法。
【问题讨论】:
-
这个同源策略是有史以来最愚蠢的事情。如果我是一段恶意的 JavaScript 并且我想加载恶意数据,我只会在页面中包含任意脚本标签,而不是从图像数据中读取“s3kri7 c0mm4nd5”。唯一想要读取图像数据的人是客户端开发人员。至于从 vpn 窃取“绝密图像数据”,如果您的网站已经被 xss 过,那么键盘记录将更具破坏性。所有这些“保护”的作用都是让合法的开发人员试图让 JavaScript 完成最简单的任务。
-
SOP 在这里防止合法的攻击媒介。假设您在照片共享网站上有一个私人相册(或检查存储在您的网上银行中的图像):如果没有脏画布保护,您访问的网络上的任何页面都可以获取那些图片如果他们知道 URL 并且您已登录,因为从
<img>标签发送的请求使用您的 cookie。这里的问题不在于受到 XSS 攻击的站点;问题在于Web 上的任何页面 都可以使用您的身份验证 cookie 获取和读取画布上的图像。 -
tl;dr: 就目前而言,任何跨域网站都可以显示您需要授权的图片(私人照片、检查图片、等)在
<img>标记中,但是,由于 SOP,他们无法读取画布中这些图像的内容,例如,将它们保存到服务器。 -
我已经同意这确实可以防止一些合法的攻击媒介。现在随着 CORS 支持变得普遍,可以正确地允许访问托管在外部域的资源。对于普通开发人员来说,这仍然是一种痛苦,因为猫照片的额外安全性的成本/收益很低,但对于在图像中莫名其妙地显示敏感信息的银行来说,确保互联网的安全非常重要。
-
我想知道如果我喜欢
document.imd={};然后做document.imd[elementId] = document.getElementById(elementId).getContext("2d").getImageData(0,0,img.width, img.height);并且只有在那之后才会运行document.getElementById(elementId).getContext("2d").drawImage(img,0,0)会发生什么。如果我在图像数据被污染之前获得对图像数据的引用,那么浏览器会做什么?
标签: html canvas subdomain same-origin-policy