防止jquery ajax从脚本或html响应执行javascript

防止jquery ajax从脚本或html响应执行javascript,javascript,html,ajax,jquery,Javascript,Html,Ajax,Jquery,根据文件: 如果指定了html,则将检索 在HTML作为字符串返回之前执行数据。同样地, 脚本将执行从 服务器,则不返回任何内容 如何预防? 我有js可以修改通过ajax获得的内容。在返回html之前执行它毫无意义,因为它没有要处理的内容(至少在我的例子中是这样) 我的代码: function do_ajax(url) { $.ajax( { cache: false, url : url, success: fun

根据文件:

如果指定了html,则将检索 在HTML作为字符串返回之前执行数据。同样地, 脚本将执行从 服务器,则不返回任何内容

如何预防? 我有js可以修改通过ajax获得的内容。在返回html之前执行它毫无意义,因为它没有要处理的内容(至少在我的例子中是这样)

我的代码:

function do_ajax(url)
    {
    $.ajax(
        {
        cache: false,
        url : url,
        success: function(response, status, xhr)
            {
            var ct = xhr.getResponseHeader("content-type") || "";
            if (ct.indexOf('script') > -1) {
                try {
                eval(response);
                }
                catch(error) { }
                }
                else
                {
                var edit_dialog = $('<div class="edit_dialog" style="display:hidden"></div>').appendTo('body');
                edit_dialog.html(response);
                edit_dialog.dialog({ modal:true, close: function(event, ui) { $(this).dialog('destroy').remove(); } });
                }

            },
        error:function (xhr, ajaxOptions, thrownError){
                   alert(xhr.status);
                   alert(thrownError);
                }
        });
    }
函数do\u ajax(url)
{
$.ajax(
{
cache:false,
url:url,
成功:功能(响应、状态、xhr)
{
var ct=xhr.getResponseHeader(“内容类型”)| |“”;
if(ct.indexOf('script')>-1){
试一试{
评价(反应);
}
捕获(错误){}
}
其他的
{
var edit_dialog=$('').appendTo('body');
编辑_dialog.html(响应);
编辑对话框({modal:true,close:function(event,ui){$(this.dialog('destroy').remove();}});
}
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(xhr.状态);
警报(thrownError);
}
});
}

ajax接收到的脚本执行两次。首先由我在eval(响应)中执行,然后jquery再次执行它(如文档中所述)

文档声明,在HTML作为字符串返回之前,将执行检索到的数据中嵌入的任何Javascript。如果您想更改使用ajax调用检索到的任何内容,可以在succes属性中执行此操作:

$.ajax({
  url: "example.html",
  type: "GET",
  dataType: "html",
  succes: function(data){
     // Example: alert(data);
     // Do whatever you want with the returned data using JS or jQuery methods
  }
});

jQuery在响应时执行javascript,这真是令人讨厌的事情之一。 其他框架(如MooTools)禁用响应中的脚本执行,除非您专门设置希望执行响应,这是一种更好的方法

我认为防止脚本执行的唯一方法是添加一个自定义的数据过滤器 这很简单,但我认为它应该是默认的,如果您需要的话,它应该是一个ajax选项来启用脚本执行(我从来没有使用过它,其他框架默认会禁用它以实现安全性等)

范例

$.ajax('uri',{
    dataFilter: function(data, type)
    {
        type = type || 'text';
        if(type=='html'||type=='text'){
            /*return data.replace(/<script.*>.*?<\/script>/gi, '');*/
            return data.replace(/<script.*?>([\w\W\d\D\s\S\0\n\f\r\t\v\b\B]*?)<\/script>/gi, '');
        }
        return data;
    }
    , success: function(data)
    {
        // whatever
    }
});
$.ajax('uri'{
dataFilter:函数(数据,类型)
{
类型=类型| |“文本”;
如果(类型=='html'| |类型=='text'){
/*返回数据。替换(/.*?/gi')*/
返回数据。替换(/([\w\w\d\d\s\s\0\n\f\r\t\v\b\b]*?)/gi,”);
}
返回数据;
}
,成功:函数(数据)
{
//随便
}
});
**更新** 需要那个疯狂的正则表达式来覆盖更多的脚本标记实例

注意 如果未在选项中设置数据类型,则它将在数据筛选器中未定义,因此我只是将其默认为筛选器的文本-如果删除该行,则它仅在显式设置数据类型的情况下才起作用。

在请求HTML时,不会在返回时对脚本求值。你在问题中引用的段落实际上是文件中的一个长期错误。新的文档有这样一句话(我的重点):

“html”:以纯文本形式返回html;插入DOM时,将对包含的脚本标记进行评估

如果指定了
text
html
不进行预处理。数据只需传递到成功处理程序,并通过
jqXHR
对象的responseText属性提供

在本例中,当您调用

edit_dialog.html(response);
如果您不想在将响应插入DOM之前评估脚本,您应该能够执行以下操作:

edit_dialog.html($($.parseHTML(response)));
是默认情况下删除脚本标记的键。但是,请注意,parseHTML不是XXS安全的,如果您的源代码未知,这仍然是一个安全问题。

已经充分解决了HTML响应的问题-事实上,嵌入在这些响应中的脚本不会自动执行,除非您将HTML添加到DOM中,这与您引用的错误文档相反

这就留下了问题标题中询问的另一个案例——阻止脚本响应在收到时自动执行。使用
dataType
设置可以轻松完成此操作

$.ajax('myscript.js', {
    dataType: 'text',
    success: function (response) {
        // Do something with the response
    }
})
dataType
设置为
'text'
将导致jQuery忽略从服务器返回的
Content-Type
头,并将响应视为纯文本,从而防止JavaScript响应的默认行为(即执行它们)。来自(最近更正的):

默认情况下,预处理的类型取决于响应的内容类型,但可以使用dataType选项显式设置。如果提供了dataType选项,则响应的Content-Type头将被忽略

如果指定了
text
html
,则不会进行预处理。数据只需传递给成功处理程序,并通过
jqXHR
对象的responseText属性提供


您有您的代码示例吗?上面添加了代码。所以,当我收到脚本时,它会执行两次。当我注释掉eval(响应)时,它是由jquery执行的。您是否在
url
中传递GET数据?是的,我用url传递GET数据您对“它没有要处理的内容”的确切含义是什么?你的意思是你正在检索的js对当前页面上的元素有引用吗?当我只收到js(数据类型:'js'),并且在成功函数中我对响应进行评估时,它会执行两次。首先是我的eval,然后是文档中描述的jquery本身。html也是如此。为什么