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常用对话框小集
Sep 13 Javascript
Javascript函数式编程语言
Oct 11 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
Dec 22 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
js实现点击每个li节点,都弹出其文本值及修改
Dec 15 Javascript
基于MVC方式实现三级联动(JavaScript)
Jan 23 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
May 30 Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
Oct 19 Javascript
vue 页面回退mounted函数不执行的解决方案
Jul 26 Javascript
JS如何判断对象是否包含某个属性
Aug 29 Javascript
vue实现倒计时功能
Mar 24 Vue.js
很酷的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 mkdir()无写权限的问题解决方法
2014/06/19 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
微信小程序 简易计算器实现代码实例
2019/09/02 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
Python开发编码规范
2006/09/08 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
大学新生军训自我鉴定
2014/03/18 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
安全例会汇报材料
2014/08/23 职场文书
公务员考察材料范文
2014/12/23 职场文书
总经理检讨书范文
2015/02/16 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
青岛市的收音机研制与生产
2022/04/07 无线电