如何在潜在危险请求的情况下覆盖来自 WebAPI 的默认 HTML 页面响应
Posted
技术标签:
【中文标题】如何在潜在危险请求的情况下覆盖来自 WebAPI 的默认 HTML 页面响应【英文标题】:How to override default HTML page response from WebAPI in case of Potentially Dangerous Request 【发布时间】:2020-12-10 05:38:24 【问题描述】:我有一个包含多个路由和控制器的 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 information about the error and where it originated in the code.
...
此安全异常在进入我的自定义控制器之一之前引发,我在该控制器中设置了错误处理逻辑。有没有办法覆盖这个返回的 HTML,而是返回一个标准的 HttpResponse 或 HttpResponseMessage 而不完全替换在它到达我的路由之前明显正常运行的标准安全措施?这是一个不明智的想法吗?这是可配置的设置吗?
【问题讨论】:
【参考方案1】:我将发布在this post 的帮助下得到的答案。请注意此答案下方的 cmets,以了解为什么我的答案略有不同。在你们有机会回答/指出我的错误之前,我不会将此答案标记为“已接受”。我确实觉得我在这里尝试做的 IS 与问题和答案有足够的不同,它值得自己发布。我们将看看模组和暴徒是否同意。
我实际上是在覆盖 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 语句并以这种方式返回每个异常。老实说,我还没有遇到任何其他问题。
【讨论】:
向客户端发送服务器端异常消息可能会让一些有安全意识的人畏缩。我喜欢返回一个具有User Friendly Exception Message 的 JSON 对象(如果可用),但包括针对特定高信任情况的特定情况(例如超级用户,或处于调试模式时,或请求来自与服务器相同的机器)。 另外:ExceptionHandlers 可能是比 Application_Error 更好的方法 @StriplingWarrior 我当然可以理解。这将用于一个内部系统,只有很少的“真实”用户和大多数应用程序在同一台服务器上,但您的关注是值得关注和赞赏的。您能否详细说明如何自定义 ExceptionHandlers?我必须承认我对 Web API 没有太多经验,而且我不确定如何在我的控制器之外访问它们。 您只需创建一个具有异常处理逻辑的类,并将其注册到 Web API 以便它在所有请求时都处于活动状态。 this page 的自定义错误消息异常处理程序和注册异常过滤器部分应该可以帮助您入门。如果要返回 JSON 对象而不是纯文本,请使用带有 JsonMediaTypeFormatter 的 ObjectContent 的 ResponseMessageResult。以上是关于如何在潜在危险请求的情况下覆盖来自 WebAPI 的默认 HTML 页面响应的主要内容,如果未能解决你的问题,请参考以下文章
<BR>...")中检测到有潜在危险的 Request.Form 值。
请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止