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 checkbox 全选/反选及批量删除
Apr 28 Javascript
JS求平均值的小例子
Nov 29 Javascript
node.js中的socket.io的广播消息
Dec 15 Javascript
node.js中的fs.lchownSync方法使用说明
Dec 16 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
jquery不常用方法汇总
Jul 26 Javascript
JavaScript实现搜索框的自动完成功能(一)
Feb 25 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
May 13 Javascript
js判断数组key是否存在(不用循环)的简单实例
Aug 03 Javascript
vue.js的安装方法
May 12 Javascript
浅探express路由和中间件的实现
Sep 30 Javascript
vue跳转页面的几种方法(推荐)
Mar 26 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
杏林同学录(七)
2006/10/09 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
javascript的内存管理详解
2013/08/07 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
Python生成器generator原理及用法解析
2020/07/20 Python
Visual Studio code 配置Python开发环境
2020/09/11 Python
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
小学红领巾中秋节广播稿
2014/01/13 职场文书
美德好少年主要事迹
2014/01/29 职场文书
索桥的故事教学反思
2014/02/06 职场文书
班主任寄语大全
2014/04/04 职场文书
对照四风自我剖析材料
2014/10/07 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
七年级地理教学计划
2015/01/22 职场文书
党员活动总结
2015/02/04 职场文书
2015年度党员个人总结
2015/02/14 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
网吧管理制度范本
2015/08/05 职场文书
win10下go mod配置方式
2021/04/25 Golang