canvas脏域问题纪录

canvas 脏域问题 今天无意之中碰见了
一、问题描述:

在支持html5的浏览器中运行javascript脚本,脚本主要是操作网页上的标签canvas,出错的操作为, getImageData(img,……),

chrome 下出错信息为:"Unable to get image data from canvas because the canvas has been tainted by cross-origin data",

fireFox 下出错信息为: "Security error" code: "1000"

关键代码如下所示:

复制代码
init:function(){
            var img=new Image();             
            img.src="http://10.0.5.199:8080/hadoopWebGis2/jsp/map.jsp?img=0_0_0";
            var ctx=this.context3D;
            img.onload=function(){                
                ctx.drawImage(img,0,0);
                var imgData=ctx.getImageData(0,0,img.width,img.height);  //出错行
                ctx.putImageData(imgData,50,50);
            };            
        },
复制代码
二、探索与解答

  在网上搜索时发现大部分都说的是,getImageData这个函数,必须在服务器端运行,如果没有服务器环境(比如,只是一个本地的 html网页,操作本地的一张图片),就会报"Unable to get image data from canvas because the canvas has been tainted by cross-origin data"错误。

但是很明显的,我上面的示例程序是运行在一个 tomcat服务器中的,仍然报了这个错误。那么这个问题到底是怎么回事呢?

后来在stackoverflow上找到了问题的原因。(强烈推荐stackoverflow网站,这是一个非常著名的技术问答网站,涵盖的范围非常广,包括C、C++、java、web、linux等各方面。中国学生大多不喜欢看英文网页,但事实上,很多问题,中文网页看一大堆也没有办法,在很多优秀的英文网站,如stackoverflow上却能很快找到答案。)

下面是stackoverflow上对该问题的一个回答:

翻译如下:为了阻止欺骗,浏览器会追踪 image data。当你把一个“跟canvas的域不同的”图片放到canvas上,这个canvas就成为 “tainted”(被污染的,脏的),浏览器就不让你操作该canvas 的任何像素。这对于阻止多种类型的XSS/CSRF攻击(两种典型的跨站攻击)是非常有用的。

上面的话中关键点在于红色标记出的文字“跟canvas的域不同的”, 于是我查看了我的图片请求与网页请求的地址,发现它们的域果然是不同的,

时间: 2024-11-06 20:43:46

canvas脏域问题纪录的相关文章

Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法

同源是指同样的协议.域名.port,三者都同样才属于同域.不符合上述定义的请求,则称为跨域. 相信每一个开发者都曾遇到过跨域请求的情况,尽管情况不一样,但问题的本质都能够归为浏览器出于安全考虑下的同源策略的限制. 跨域的情形有非常多,最常见的有Ajax跨域.Socket跨域和Canvas跨域.以下列举一些我们常见的跨域情形下.某些浏览器控制台给出的错误提示: FireFox下的提示: 已阻止交叉源请求:同源策略不同意读取***上的远程资源.能够将资源移动到同样的域名上或者启用 CORS 来解决问

canvas跨域完美解决,微信头像解决跨域

现在前端技术发展的越来越快,很多图片合成这种耗费服务器性能的,都可以移动到前端进行了合成了.而且合成很方便,我们利用 canvas 可以实现好多东西. 自动打算利用前端来合成图片,在网上就找到了 html2canvas,大家可以试试,很简单. 前端 canvas 经常会遇到 『图片跨域』 的问题. 项目中,最典型的例子是: 将微信头像,通过 canvas 来合成图片 之前的做法一直是,将微信头像保存下来,可以存储到目录,和用户 id 相关的命名.我是直接获取图片的 base64 存储到了数据库,

网页保存为图片及高清截图的优化 | canvas跨域图片配置

本次技术调研来源于H5项目中的一个重要功能需求:实现微信长按网页保存为截图. 这里有个栗子(请用微信打开,长按图片即可保存):3分钟探索你的知识边界 将整个网页保存为图片是一个十分有趣的功能,常见于H5活动页的结尾页分享.以下则是项目中调研和踩坑的一些小结和汇总. 一.实现HTML网页保存为图片 1.1 已知可行方案 现有已知能够实现网页保存为图片的方案包括: 方案1:将DOM改写为canvas,然后利用canvas的toDataURL方法实现将DOM输出为包含图片展示的data URI 方案2

Canvas初探

虽然自己身为后端工程师,但仍然有一颗前端的??,尤其是游戏前端.所以最近在试着学习如何用js编写html5游戏,并看了一个简单的‘俄罗斯方块’的js游戏源码,结论有以下几点. 1.图像效果实现可以基于canvas 和 css 两种,估计多数的js游戏开发引擎也是这样的. 2.Js写些简单好玩的游戏所需要的环境很简单:浏览器,Js文件编辑器,一个发布html静态网页的WebServer. 这里简单说下学习Canvas的一些东东,网上看找了个教程网站:http://javascript.ruanyi

解决方法!:getImageData on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.

Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data. 最近在自学html5 CSS3很推荐李刚的 这个书<html5.css3,js权威指南>,今天在家里测试发现 canvas中的getImageData报错 Failed to execute 'getImageData'

【HTML5 Canvas】计算元件/显示对象经过Matrix变换后在上级/舞台上的bounds(边界矩形rect)

如上图所示,这样的一个简单矩形,边界矩形是(x:-28, y:-35, width:152, height:128),这是在这个元件/显示对象自己的坐标空间的范围. 那么把这个放到父元件(舞台)中,再做一定变换.如下图所示,白色区域就是舞台,蓝色矩形中的白色十字架标记,就是世界坐标的(0,0)点.       在舞台这个世界坐标系中,边界区域又是什么呢?我们的目标就是计算下图中的红色区域. 其实算法,很简单,在放到舞台之前,在蓝色矩形自己的局部坐标系中,边界是(x:-28, y:-35, wid

HTML-Canvas02

文字对齐方式 : 水平对齐 //是用 textAlign 属性设置水平对齐方式(默认坐标点) ctx.textAlign = "start"; ctx.font = "30px Arial"; ctx.fillText("Hello World",100,50); //水平的三个坐标点分别为 start(a),left(a); center(b) ;end(c),right(c). 垂直对齐: //是用 textBaseline 属性设置垂直对齐

自定义控件三部曲之绘图篇(十)——Paint之setXfermode(一)

前言: 不应该一路失望 又一路等待 时间它说 世界还有不同的海 但不要告诉我 现实它很坏 我想看看 自己的能耐 --莫文蔚<境外> 系列文章: Android自定义控件三部曲文章索引:http://blog.csdn.net/harvic880925/article/details/50995268 一.GPU硬件加速 1.概述 GPU英文全称Graphic Processing Unit,中文翻译为"图形处理器".与CPU不同,GPU是专门为处理图形任务而产生的芯片. 在

HTML5中的Web Workers

https://www.cnblogs.com/yanan-boke/p/6954390.html https://segmentfault.com/a/1190000014938305 HTML5 工作线程原理 传统上的线程可以解释为轻量级进程,它和进程一样拥有独立的执行控制,一般情况下由操作系统负责调度.而在 HTML5 中的多线程是这样一种机制,它允许在 Web 程序中并发执行多个 JavaScript 脚本,每个脚本执行流都称为一个线程,彼此间互相独立,并且由浏览器中的 JavaScri