我有一个页面,其中我使用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函数中的“错误”未执行,并且未显示警告框,我们能够处理错误。如何处理此类错误并将用户重定向到自定义页面?
答案 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),而不是返回错误。
您可以通过两种方式完成此操作:
使用Try... Catch...
块。你的webservice方法似乎已抛出异常并返回它,所以抓住它然后而不是返回它,设置并返回302响应。
如果正版调用webservice可以在正常操作下生成异常(这通常很糟糕!),您需要验证请求中收到的数据,看看它是什么Web服务方法期望接收(收到数据吗?它是由ajax请求发送的正确结构吗?等等)
注意:如果请求 包含有效数据,则没有简单的方法可以通过其他方式检测是来自真正的源(ajax调用)还是来自伪造的请求。 是的解决方案,但它们涉及并且可能需要多次调用以进行身份验证等。