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实现的动态文字变换
Jul 28 Javascript
jquery插件之easing 动态菜单
Aug 21 Javascript
js作用域及作用域链概念理解及使用
Apr 15 Javascript
jquery默认校验规则整理
Mar 24 Javascript
JavaScript实现大数的运算
Nov 24 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
Nov 24 Javascript
详细讲解JavaScript中的this绑定
Oct 10 Javascript
javascript获取以及设置光标位置
Feb 16 Javascript
简单谈谈关于 npm 5.0 的新坑
Jun 08 Javascript
ionic环境配置及问题详解
Jun 27 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
vue3为什么要用proxy替代defineProperty
Oct 19 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
Python 性能优化技巧总结
2016/11/01 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
Python实现注册、登录小程序功能
2018/09/21 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
python进阶之自定义可迭代的类
2019/08/20 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
python的链表基础知识点
2020/09/13 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
授权委托书范本
2014/04/03 职场文书
食品安全责任书
2014/04/15 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
车辆年检委托书范本
2014/10/14 职场文书
海上钢琴师观后感
2015/06/03 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python