问题描述
我有一个带有多个路由和控制器的Web API 2项目。我开始测试一些相当标准的安全功能,包括sql注入。我试图通过数据库操作将请求参数“ *”传递给路由。随即,我收到了HTML形式的详细响应,这对我用来测试的C#控制台应用程序没有多大作用。
但是,HTML确实具有我想要的唯一真实信息,即异常消息以及状态代码。这是HTML的一部分:
<body bgcolor="white">
<span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>
<h2> <i>A potentially dangerous Request.Path value was detected from the client (*).</i> </h2></span>
<font face="Arial,Helvetica,Geneva,SunSans-Regular,sans-serif ">
<b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more @R_600_4045@ion about the error and where it originated in the code.
...
此安全异常在它进入我有适当错误处理逻辑的自定义控制器之一之前引发。有没有一种方法可以覆盖返回的HTML,而不是返回标准的HttpResponse或HttpResponseMessage,而无需完全替换甚至在到达我的路由之前显然可以正常工作的标准安全措施?这是不明智的主意吗?这是可配置的设置吗?
解决方法
我将在this post的帮助下发布我得出的答案。请注意此答案下方的评论,以了解我的答案为何略有不同。在大家都有机会回答/指出我的错误之前,我不会将此答案标记为“已接受”。我确实觉得我在这里试图做的 IS 与问题和答案有足够的不同,它可以保证自己发表文章。我们将看看mod和暴民是否同意。
我实际上是覆盖Global.asax.cs类文件中的默认错误事件处理程序,并且仅将HttpException.Message
写入Response
:
protected void Application_Error(object sender,EventArgs e)
{
var exception = Server.GetLastError();
if (exception is HttpException)
{
Server.ClearError();
Response.Clear();
Response.StatusCode = (int)HttpStatusCode.BadRequest;
Response.Write(exception.Message);
HttpContext.Current.ApplicationInstance.CompleteRequest();
return;
}
}
我甚至可以消除if语句,然后以这种方式返回每个异常。老实说,我还没有遇到任何其他问题。