处理jQuery Ajax方法引发的错误

时间:2013-04-18 14:33:53

标签: c# asp.net web-services jquery burp

我有一个页面,其中我使用jQuery ajax方法来调用一个简单的Web服务,它将从数据库中获取一些数据并将其绑定到页面中的某些控件。在select的 onchange 事件上调用ajax方法(此处HTTP请求为POST)。以下是jQuery ajax方法

function CallAjax(url, jsonData, SucessFunction, FailurFunction) {
$.ajax({
    type: "POST",
    url: url,
    data: jsonData,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: SucessFunction,
    error: function(){
       alert('error occured');
    }
});

}

上述方法的URL是somepage.aspx / getDataFromDatabse,其中getDataFromDatabse是webservice方法。我们的测试人员正在使用burp套件测试页面。当他们直接在浏览器中访问URL(www.example.com/somepage.aspx/getDataFromDatabse)时,burp套件中显示的HTTP方法是GET并且引发错误并且用户被重定向到适当的页面。但是当他们直接访问上述URL并在burp suite中拦截请求并将GET请求更改为POST请求时,以下错误消息将直接显示在浏览器中:

  

{“消息”:“处理请求时出错。”,“StackTrace”:“”,“ExceptionType”:“”}

上述ajax函数中的“错误”未执行,并且未显示警告框,我们能够处理错误。如何处理此类错误并将用户重定向到自定义页面?

1 个答案:

答案 0 :(得分:1)

看起来你的服务器的响应是一个有效的JSon响应,尽管它包含(你)读取的错误。因此$.ajax(...)调用将响应视为成功,而不是错误。

您可以返回有效的JSon响应,并在该响应中指示是否存在错误,以及任何其他信息,例如用户友好的错误消息,重定向URL等。

error:调用的$.ajax(...)处理程序应该用于真正的服务器响应错误(即未处理的500错误,超时等)。

例如,您成功的JSon响应可能类似于:

{
    success: true,
    errorMessage: null,
    errorRedirectUrl: null,
    data: { .... your successful data response .... }
}

并且您的JSon响应失败(例如由于验证问题,而不是服务器故障)将如下所示:

{
    success: false,
    errorMessage: 'There was an error processing the request.',
    errorRedirectUrl: 'http://....someurl...',
    data: null
}

然后,您在response.success == true来电的success:选项中查看$.ajax(....),并进行相应处理。

通过使用单一,一致的结构,success:选项处理完成的所有ajax请求,然后确定是否存在处理错误以及如何处理它,例如显示提醒用户,将其重定向到URL等...

相比之下,error:选项只处理那些没有带回你可以使用的响应的ajax请求。

<强>更新

在您的服务器上,您已经在处理接收GET http请求和POST http请求之间的区别。所以,我认为您的问题是您还需要检测POST请求是否包含webservice方法所需格式的有效数据。

因此,您的Web服务需要确定http请求中的POSTed数据是否采用它希望接收的格式,如果没有返回HTTP重定向响应(302),而不是返回错误。

您可以通过两种方式完成此操作:

  1. 使用Try... Catch...块。你的webservice方法似乎已抛出异常并返回它,所以抓住它然后而不是返回它,设置并返回302响应。

  2. 如果正版调用webservice可以在正常操作下生成异常(这通常很糟糕!),您需要验证请求中收到的数据,看看它是什么Web服务方法期望接收(收到数据吗?它是由ajax请求发送的正确结构吗?等等)

  3. 注意:如果请求 包含有效数据,则没有简单的方法可以通过其他方式检测是来自真正的源(ajax调用)还是来自伪造的请求。 的解决方案,但它们涉及并且可能需要多次调用以进行身份​​验证等。