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 相关文章推荐
JS隐藏参数post传值实例
Apr 18 Javascript
根据表格中的某一列进行排序的javascript代码
Nov 29 Javascript
Area 区域实现post提交数据的js写法
Apr 22 Javascript
javascript获取元素偏移量的方法有哪些
Jun 24 Javascript
jQuery实现给页面换肤的方法
May 30 Javascript
前端微信支付js代码
Jul 25 Javascript
同步文本框内容JS代码实现
Aug 04 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 Javascript
js中对象与对象创建方法的各种方法
Feb 27 Javascript
vue前后分离调起微信支付
Jul 29 Javascript
vue实现侧边栏导航效果
Oct 21 Javascript
HTML+JS实现在线朗读器
Feb 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四种基础算法代码实例
2013/10/29 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
js的event详解。
2006/09/06 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
英国婴儿和儿童服装网站:Vertbaudet
2018/04/02 全球购物
护理自荐信
2013/10/22 职场文书
网站开发实习生的自我评价
2013/12/11 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
Python数据处理的三个实用技巧分享
2022/04/01 Python