Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行通过AJAX返回的JavaScript的正确方法(无jQuery)_Javascript_Ajax_Eval - Fatal编程技术网

执行通过AJAX返回的JavaScript的正确方法(无jQuery)

执行通过AJAX返回的JavaScript的正确方法(无jQuery),javascript,ajax,eval,Javascript,Ajax,Eval,假设我得到一个对AJAX加载数据请求的响应,该请求混合了JavaScript和HTML,例如: <script>window.alert('Hello World!');</script> <p>This is a paragraph. Lorem ipsum dolor sit amet...</p> 请注意,您正在从用户获取输入,并在站点上的脚本上下文中运行它。因此,该脚本可以执行浏览器/域上运行的JavaScript能够执行的任何操作(包括

假设我得到一个对AJAX加载数据请求的响应,该请求混合了JavaScript和HTML,例如:

<script>window.alert('Hello World!');</script>
<p>This is a paragraph. Lorem ipsum dolor sit amet...</p>

请注意,您正在从用户获取输入,并在站点上的脚本上下文中运行它。因此,该脚本可以执行浏览器/域上运行的JavaScript能够执行的任何操作(包括cookie窃取、XSS、恶意软件驱动等)

实际上,要降低风险,您唯一能做的就是不评估()用户提供的内容。我建议考虑以下替代方案:

  • 将iframe用作运行用户脚本的环境:
  • 使用Caja。它允许网站安全地嵌入来自第三方的DHTML web应用程序,并支持嵌入页面和嵌入应用程序之间的丰富交互。它使用一个对象能力安全模型来支持多种灵活的安全策略。

  • eval在这个场景中并不是特别邪恶,它与动态添加一个脚本标记(可以将一个.js文件拉下来并运行它)并没有太大区别。也就是说,还有其他选项,例如,您可以动态创建脚本标记,使用下拉的脚本标记的内容创建文本节点,然后将其添加到文档中。与innerHTML技术不同,它将实际运行内容。实际上,与eval相比的唯一优势是,如果堆栈崩溃或出现语法错误,您可能会获得更有意义的堆栈跟踪等

    var newScriptTag = document.createElement('script');
    newScriptTag.appendChild(document.createTextNode(
         origScriptTag.innerHTML)
    document.body.appendChild(newScriptTag);
    

    今天,我将JavaScript放在响应HTML的底部,解决了这个问题


    我有一个AJAX请求,它返回了一堆HTML,这些HTML显示在一个覆盖图中。我需要在返回的响应HTML/overlay中的按钮上附加一个click事件。在普通页面上,我会将JavaScript包装在“window.onload”或“$(document.ready)”中,以便在呈现新覆盖的DOM后将事件处理程序附加到DOM对象,但由于这是AJAX响应,而不是新页面加载,因此该事件从未发生,浏览器从未执行我的JavaScript,我的事件处理程序从未连接到DOM元素,我的新功能也无法工作。同样,我解决了我的“在AJAX响应中执行JavaScript问题”,没有在文档的开头使用“$(document).ready”,但是,将我的JavaScript放在文档的末尾,并在HTML/DOM呈现后运行。

    如果您希望像这样执行JavaScript,那么您必须在这一点上走到黑暗的一面。这已经被询问并回答了很多次了SO@user85569当前位置我真的希望那不是真的。我使用示例加载器进行测试,它可以正常工作。使用
    eval
    ,我有一种很有趣的感觉,就像我在c++@david中使用
    goto
    时一样:我找不到一个适合我的解决方案,但我搜索的时候有很多,大多数都是使用jQuery。jQuery是开源的,你可以看到它们是如何做到的。实际上,该函数只加载同一个域上的URL,所以它应该是值得信赖的。。。正确的?事实上,如果我理解正确,
    XMLHttpRequest
    无论如何都不能从其他域加载。@steveo225关于eval有很多历史,如果你知道值得你发送给客户端的数据可以使用eval,但它可能会变得有点慢。这不是真的。他没有加载“来自用户的输入”-该函数由程序员使用程序员提供的URL调用。它引用的文件是由程序员的服务器提供服务的静态JavaScript文件。任何地方都没有用户输入!因此,以这种方式使用eval是完全安全的。当您使用脚本标记嵌入脚本时,它也会在全局范围内运行-这没有区别。您不应该对用户生成的内容(全部或部分)调用eval,但它对于其他任何用例都是完全安全的。
    var newScriptTag = document.createElement('script');
    newScriptTag.appendChild(document.createTextNode(
         origScriptTag.innerHTML)
    document.body.appendChild(newScriptTag);