js innerHTML 的一些问题的解决方法


Posted in Javascript onJune 22, 2008

然而,你需要知道 innerHTML 有一些自身的问题: 

1、当 HTML 字符串包含一个标记为 defer 的 script 标签(<script defer>…</script>)时,如 innerHTML 属性处理不当,在 Internet Explorer 上会引起脚本注入攻击。 
2、设置 innerHTML 将会破坏现有的已注册了事件处理函数的 HTML 元素,会在某些浏览器上引起内存泄露的潜在危险。 

还有几个其他次要的缺点,也值得一提的: 

1、你不能得到刚刚创建的元素的引用,需要你手动添加代码才能取得那些引用(使用 DOM APIs)。 
2、你不能在所有浏览器的所有 HTML 元素上设置 innerHTML 属性(比如,Internet Explorer 不允许你在表格的行元素上设置innerHTML 属性)。 
我更关注与使用 innerHTML 属性相关的安全和内存问题。很显然,这不是新问题,已经有能人围绕这些中的某些问题想出了方法。 

       Douglas Crockford 写了一个 清除函数 ,该函数负责中止由于 HTML 元素注册事件处理函数引起的一些循环引用,并允许垃圾回收器(garbage collector)释放与这些 HTML 元素关联的内存。 

       从 HTML 字符串中移除 script 标签并不像看上去那么容易。一个正则表达式可以达到预期效果,虽然很难知道是否覆盖了所有的可能性。这里是我的解决方案: 
/<script[^>]*>[\S\s]*?<\/script[^>]*>/ig
现在,让我们将这两种技术结合在到一个单独的 setInnerHTML 函数中,并将 setInnerHTML 函数绑定到 YUI 的 YAHOO.util.Dom 上:
YAHOO.util.Dom.setInnerHTML = function (el, html) {
    el = YAHOO.util.Dom.get(el);
    if (!el || typeof html !== 'string') {
        return null;
    } 
    // 中止循环引用
    (function (o) {

        var a = o.attributes, i, l, n, c;
        if (a) {
            l = a.length;
            for (i = 0; i < l; i += 1) {
                n = a[i].name;
                if (typeof o[n] === 'function') {
                    o[n] = null;
                }
            }
        }

        a = o.childNodes;

        if (a) {
            l = a.length;
            for (i = 0; i < l; i += 1) {
                c = o.childNodes[i];

                // 清除子节点
                arguments.callee(c);

                // 移除所有通过YUI的addListener注册到元素上所有监听程序
                YAHOO.util.Event.purgeElement(c);
            }
        }

    })(el);

    // 从HTML字符串中移除script,并设置innerHTML属性
    el.innerHTML = html.replace(/<script[^>]*>[\S\s]*?<\/script[^>]*>/ig, "");

    // 返回第一个子节点的引用
    return el.firstChild;
};

如果此函数还应有其他任何内容或者在正则表达式中遗漏了什么,请让我知道。 

       很明显,在网页上还有很多其他注入恶意代码的方法。setInnerHTML 函数仅能在所有 A-grade 浏览器上规格化 <script> 标签的执行行为。如果你准备注入不能信任的 HTML 代码,务必首先在服务器端过滤,已有许多库可以做到这点。

Javascript 相关文章推荐
Javascript select下拉框操作常用方法
Nov 09 Javascript
为jQuery.Treeview添加右键菜单的实现代码
Oct 22 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
Feb 13 Javascript
JS按回车键实现登录的方法
Aug 25 Javascript
JavaScript轻松创建级联函数的方法示例
Feb 10 Javascript
js中的触发事件对象event.srcElement与event.target详解
Mar 15 Javascript
vue实现todolist单页面应用
Apr 11 Javascript
谈谈JS中的!!
Dec 07 Javascript
使用vue-infinite-scroll实现无限滚动效果
Jun 22 Javascript
详解vue 命名视图
Aug 14 Javascript
微信小程序button标签open-type属性原理解析
Jan 21 Javascript
vue+Element-ui前端实现分页效果
Nov 15 Javascript
很酷的javascript loading效果代码
Jun 18 #Javascript
豆瓣网的jquery代码实例
Jun 15 #Javascript
JQuery实现自定义对话框的代码
Jun 15 #Javascript
javascript基本语法分析说明
Jun 15 #Javascript
javascript新手语法小结
Jun 15 #Javascript
JavaScript入门学习书籍推荐
Jun 12 #Javascript
asp.net和asp下ACCESS的参数化查询
Jun 11 #Javascript
You might like
关于PHP中Object对象的笔记分享
2011/06/28 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
JS DOM 操作实现代码
2010/08/01 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js鼠标悬浮出现遮罩层的方法
2015/01/28 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
python 链接和操作 memcache方法
2017/03/04 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
浅析Python函数式编程
2018/10/06 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
Python下简易的单例模式详解
2019/04/08 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
实习自荐信
2013/10/13 职场文书
大学毕业生自我鉴定
2013/11/05 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
老龄工作先进事迹
2014/08/15 职场文书
无犯罪记录证明
2014/09/19 职场文书
模范教师材料大全
2014/12/16 职场文书
初中体育课教学反思
2016/02/16 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python