Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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
C# 如何在出现潜在危险的请求时覆盖WebAPI的默认HTML页面响应_C#_.net_Api_Asp.net Web Api_Asp.net Web Api2 - Fatal编程技术网

C# 如何在出现潜在危险的请求时覆盖WebAPI的默认HTML页面响应

C# 如何在出现潜在危险的请求时覆盖WebAPI的默认HTML页面响应,c#,.net,api,asp.net-web-api,asp.net-web-api2,C#,.net,Api,Asp.net Web Api,Asp.net Web Api2,我有一个WebAPI2项目,有几个路由和控制器。我开始测试一些相当标准的安全功能,包括SQL注入。我试图通过数据库操作将请求参数“*”传递给路由。我立即得到了一个HTML格式的详细响应,对于我用来测试的C#console应用程序来说,这个响应没有多大用处 HTML确实有我想要的唯一真正的信息,那就是异常消息和状态代码。以下是HTML的一部分: <body bgcolor="white"> <span><H1>Ser

我有一个WebAPI2项目,有几个路由和控制器。我开始测试一些相当标准的安全功能,包括SQL注入。我试图通过数据库操作将请求参数“*”传递给路由。我立即得到了一个HTML格式的详细响应,对于我用来测试的C#console应用程序来说,这个响应没有多大用处

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 information about the error and where it originated in the code.
...

“/”应用程序中出现服务器错误。
潜在危险的请求。从客户端(*)检测到路径值。 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。 ...

此安全异常在进入我的一个自定义控制器之前抛出,我在其中设置了错误处理逻辑。有没有一种方法可以覆盖返回的这个HTML,而不是返回一个标准的HttpResponse或HttpResponseMessage,而不完全替换标准的安全措施,这些安全措施在它到达我的路由之前显然是正常工作的?这是一个不明智的想法吗?这是一个可配置的设置吗?

我将发布我在帮助下得出的答案。注意这个答案下面的注释,看看为什么我的答案略有不同。在你们有机会回答/指出我的错误之前,我不会将这个答案标记为“已接受”。我确实觉得我在这里试图做的与问题和答案完全不同,它保证了自己的职位。我们会看看mods和暴民是否同意

我基本上覆盖了Global.asax.cs类文件中的默认错误事件处理程序,并且只将
HttpException.Message
写入
响应中:

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语句,并以这种方式返回每个异常。老实说,我还没有遇到任何其他问题。

向客户端发送服务器端异常消息会让一些有安全意识的人畏缩。我喜欢返回一个JSON对象,该对象具有if-one-available,但对于特定的高度信任的情况(例如超级用户、处于调试模式或请求来自与服务器相同的机器)包含异常的ToString()。另外:ExceptionHandler可能是比应用程序更好的方法_Error@StriplingWarrior我当然可以理解。这将在内部系统上使用,只有很少的“真实”用户,而且大多数应用程序都在同一台服务器上,但我们注意到并感谢您的关注。您能详细介绍一下如何定制ExceptionHandler吗?我必须承认,我对Web API没有太多经验,我也不知道如何在控制器之外访问它们。您只需创建一个具有异常处理逻辑的类,然后用Web API注册它,这样它在所有请求中都是活动的。的“自定义错误消息异常处理程序”和“注册异常筛选器”部分应该可以帮助您开始。如果要返回JSON对象而不是纯文本,请使用ResponseMessageResult和带有JsonMediaTypeFormatter的ObjectContent。