将html附加到jQuery元素而不在html中运行脚本
我编写了一些代码,它使用一串html并使用jQuery清除任何丑陋的HTML(请参阅此SO问题中的早期原型)。 它工作得很好,但我偶然发现了一个问题:
当使用.append()将html包装在div中时,代码中的所有脚本元素都会被评估并运行(请参阅此SO答案以解释为什么会发生这种情况)。 我不想要这个,我真的只是希望将它们删除,但我可以在以后自己处理它,只要它们没有运行。
我正在使用此代码:
var wrapper = $('').append($(html));
我尝试这样做:
var wrapper = $('' + html + '');
但是这只会在IE中引入append()函数修复的“拒绝访问”错误(参见上面引用的答案)。
我想我可能能够重写我的代码,不需要围绕html包装,但我不确定,而且我想知道是否可以在不运行脚本的情况下附加html,无论如何。
我的问题:
-
如何在不运行脚本的情况下包装一段未知的html,最好完全删除它们?
-
我应该将jQuery抛出窗口并使用纯JavaScript和DOM操作来实现吗? 那会有帮助吗?
我不想做的事:
我不是想在客户端放置某种安全层。 我非常清楚这是毫无意义的。
更新:詹姆斯的建议
詹姆斯建议我应该过滤掉脚本元素,但是看看这两个例子(原始的第一个和詹姆斯的建议):
jQuery("").append("
helloconsole.log('gnu!'); there")
保留文本节点但写入gnu!
jQuery("").append(jQuery("
helloconsole.log('gnu!'); there").not('script'))`
不写gnu!,但也丢失了文本节点。
更新2:
詹姆斯已经更新了他的答案,我接受了。 不过,请参阅我对他的回答的最新评论。
如何首先删除脚本?
var wrapper = $('').append($(html).not('script'));
- 创建div容器
- 使用普通JS将html放入div
- 删除div中的所有脚本元素
假设html中的脚本元素没有嵌套在其他元素中:
var wrapper = document.createElement('div'); wrapper.innerHTML = html; $(wrapper).children().remove('script');
var wrapper = document.createElement('div'); wrapper.innerHTML = html; $(wrapper).find('script').remove();
这适用于html只是文本和html在任何元素之外的文本的情况。
以下是防止加载的html中的脚本运行的另一种方法:
function preventJS(html) { return html.replace(/
详细内容在此处描述 - JavaScript:如何防止在添加到DOM中的html中执行JavaScript 。 可能这个解决方案对某些人有用。
您应该删除 script
元素:
var wrapper = $('').append($(html).remove("script"));
第二次尝试:
node-validator可以在浏览器中使用: https : //github.com/chriso/node-validator
var str = sanitize(large_input_str).xss();
或者,PHPJS有一个strip_tags函数(基于regex / evil): http ://phpjs.org/functions/strip_tags:535