我有一个AJAX调用,它返回需要注入到页面的HTML代码片段,以及“script”元素下的一些JS代码。
响应中没有html/body/head元素,只有需要注入的HTML。因此,响应可能是:
<div>lorem ipsum</div>
<script>alert(1);</script>
根据我的理解,通过AJAX获取的JS代码需要通过使用eval()或通过创建一个元素添加到页面中,即:
var script = document.createElement('script');
script.type = 'text/javascript';
script.text = response;
var head = document.getElementsByTagName("head")[0];
head.appendChild(script);
但是,我尝试在jQuery中使用.html()按原样嵌入响应-令我惊讶的是,JS代码和HTML部分似乎都得到了预期的处理,HTML部分被添加到页面中,JS代码运行得很好。
这是我尝试过的:
$.ajax({
url: url,
success: function(data) {
$('#foo').html(data);
// #foo now contains '<div>lorem ipsum</div>' and the JS alert was fired
}
});
这是一个安全的方法吗?它能在所有浏览器上工作吗?
如果不是,那么实现我正在尝试的目标的最佳方法是什么(我可能必须解析响应以将<script>
元素与其他元素分开)?
首先要感谢大家!
发布于 2011-04-08 01:02:16
好吧,有两个问题,第一,这不是最好的解决方案(可能会在浏览器上崩溃),第二,如果代码不是硬编码的(即使这样),很容易造成xss漏洞。如果ajax的html或url是可变的,你就会遇到麻烦了。
基本上,我不推荐它,我会寻找一个替代的解决方案。
发布于 2011-04-08 01:15:49
jQuery的.html()函数使用innerHTML,而IE要求在以这种方式加载的脚本上设置DEFER属性,否则这些脚本将无法执行。我认为createElement方法是一种更好的方法。
更进一步,我的观点是,最好只传输JSON,避免使用动态Javascript。然后,您可以使用JSON.parse解析响应,客户端代码可以对此数据执行任何必要的操作。
发布于 2011-04-08 02:32:56
听起来您想要做的事情可以通过JSON-P来完成。
基本上,不是进行XHR调用,而是动态创建一个script元素,该元素的SRC属性指向要加载的URL。然后,服务器将返回以下内容:
$('<div>foo</div>').appendTo('#bar');
alert(1);
好处是您可以进行跨域的JSON-P调用。缺点是,您仍然可以向XSS攻击敞开大门。但老实说,无论你做什么,这都是一个问题。只要你在你的Is和Ts上加点划线,我认为这两个选项都可以。
为了提供一个非eval/SCRIPT选项,您能描述一下您正在尝试执行的后续JS代码的性质吗?
https://stackoverflow.com/questions/5589297
复制相似问题