请仔细阅读以下声明: 假设在向 document
添加任何元素之前,$dom 中的所有不安全元素都已被移除。但它们最初已经被创建好了。好的,让我们继续...
如果处理用户文本并且可能会像这样加载:
var comment = 'I\'m a naughty person!!' +
'<script src="http://blah.com/some_naughty_javascript.js">';
var $dom = $('<div>' + comment + '</div>');
这种情况本身有危险吗?我的意思是,仅仅创建DOM节点会不会注入任何内容,还是只是简单地处理并创建结构?
例如:
var $dom = $('<script>alert("hi");</script>');
显然,直到添加到document
中,消息“hi”才会弹出。但是:
Bounty Edit
因此,如下面的答案所概述的那样,这种方法似乎并不安全,特别是有一个原因:
var $dom = $('<img src="blah.jpg"/>')
——这将立即请求图像,而不管对象是否已添加到文档中。
这对于处理HTML ajax请求会带来很大的问题。例如,如果我们想要获取表单输入的值:
$.ajax({
url: 'test.php',
success: function(responseHTML) {
var inputs = $(responseHTML).find('form input');
}
});
这将不自觉地导致浏览器请求所有图片。
悬赏奖励:
- 能够提供一个 nice、安全的方法来处理 ajax 请求,避免上述问题的任何人都会获得奖励。
- 最好不要提供正则表达式答案... 比如说,如果我们想做
$(responseHTML).find('img')
-- 不能用正则表达式删除图像标签,因此需要一种非侵入式的方式来阻止 src 加载,但仍然具有相同的属性、结构等。