• 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的域不同的”, 于是我查看了我的图片请求与网页请求的地址,发现它们的域果然是不同的,

  • 相关阅读:
    1337语言
    BEEF实战全记录
    MySQL字符集编码设置与PHP显示乱码的解决办法
    设置MySql5.5数据库的字符编码为UTF8,解决中文乱码问题
    如何在BeEF中使用metasploit颠覆你的浏览器
    xss窃取cookie测试
    xss测试代码
    'or'='or'经典漏洞代码分析
    mysql注入漏洞测试网页
    ipc$入侵
  • 原文地址:https://www.cnblogs.com/piperck/p/4437036.html
Copyright © 2020-2023  润新知