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 相关文章推荐
cnblogs TagCloud基于jquery的实现代码
Jun 11 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
Apr 08 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
Jul 25 Javascript
Node学习记录之cluster模块
May 31 Javascript
vue生成随机验证码的示例代码
Sep 29 Javascript
Vue官网todoMVC示例代码
Jan 29 Javascript
vue router 配置路由的方法
Jul 26 Javascript
vue移动端实现手机左右滑动入场动画
Jun 17 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
Sep 11 Javascript
工作中常用js功能汇总
Nov 07 Javascript
Vue指令实现OutClick的示例
Nov 16 Javascript
JavaScript中Object、map、weakmap的区别分析
Dec 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
php对数组排序的简单实例
2013/12/25 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
jquery选择器之内容过滤选择器详解
2014/01/27 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
python字符串中的单双引
2017/02/16 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
外贸英语毕业生自荐信
2013/11/14 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
美术社团活动总结
2014/06/27 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript