【问题标题】:colon(:) in url causes error in asp.neturl 中的冒号(:) 导致 asp.net 中的错误
【发布时间】:2015-06-09 09:04:29
【问题描述】:

我正在创建一个 webAPI,当我在请求字符串中包含一个冒号 (:) 时,

http://localhost:49579/api/mycontroller/:

我得到这个错误:

从客户端 (:) 检测到具有潜在危险的 Request.Path 值。
[HttpException (0x80004005):从客户端 (:) 检测到潜在危险的 Request.Path 值。] System.Web.HttpRequest.ValidateInputIfRequiredByConfig() +9673044 System.Web.PipelineStepManager.ValidateHelper(HttpContext 上下文) +53

我不打算在实际的 api 请求中包含特殊字符,但是如果某些不良用户在请求中输入特殊字符会导致错误。

问题:如何在 API 端处理此错误?有什么办法吗?还是我应该只给开发人员一个关于这个问题的说明?

注意:我无法控制将来访问 API 的客户端。我正在使用 Visual Studio 2012 for Web; .Net 4.0 版; ASP.Net WebApi;和 C#;我确实认为代码对我的情况来说是不必要的,除了某些特殊字符外,Api 都可以工作。但如果您不这么认为,请告诉我您还需要知道什么。
另一个注意事项:我不是想办法在 url 中允许它,我只是在寻找专门处理错误的方法。

【问题讨论】:

  • 您应该处理该异常并以某种方式返回错误的请求状态,这取决于您的 API 或只是 http 状态 400

标签: c# asp.net asp.net-web-api


【解决方案1】:

如果您确实想允许,请尝试在您的 web.config 中设置 relaxedUrlToFileSystemMapping = true

<httpRuntime relaxedUrlToFileSystemMapping = "true" />

MSDN Linkhere it is 在上下文中。

或者,进行此配置更改,然后选择返回相关的错误消息,或重定向它们或您想做的任何事情。

编辑:如果您只想在单个方法的请求字符串中允许冒号,您始终可以使用[ValidateInput(false)] 装饰该操作方法,如this answer of mine 中更详细的说明。这意味着您无需在 web.config 中降级您的请求验证。

【讨论】:

  • 嘿,这有帮助。我刚刚添加了一些属性。只是添加 relaxedUrlToFileSystemMapping = "true" 对我不起作用。我改用了这个:&lt;httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="" relaxedUrlToFileSystemMapping="true" &gt;&lt;/httpRuntime&gt; 将此添加到您的答案中,以便我可以接受。
  • 是的,我知道移除“安全装置”是危险的。我只需要手动过滤输入..这不应该太难..
  • 你可以换一种方式试试。即仅从您需要的那些方法中删除“安全措施”。请参阅我对答案的编辑。
【解决方案2】:

您可以实现 ExceptionFilterAttribute。例如:

public class HttpExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Exception is HttpException)
        {
            actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
        }
    }
}

此属性可用于操作方法、控制器或全局。但是不要忘记在启动时注册这个过滤器。 更多细节可以在这里找到:Exception Handling in ASP.NET Web API

【讨论】:

  • 所以,我尝试了这个,它并没有改变任何事情。还是谢谢。
  • @panda.o24 你到底想达到什么目的?
【解决方案3】:

我会在“最终用户”表示中避免使用 Web 路径中的字符串。

如果您确实需要传递文本,将其作为 POST 请求的参数传递是否会有所帮助。这种方法肯定适用于任何字符串

如果您必须通过 GET 请求执行此操作,请注意一些额外的编码/解码逻辑,这将帮助您跨越 Request.Path 限制。 (这里我的意思是将原始字符串转换为一些对 url 友好的字符串,并且在控制器端将把对 url 友好的字符串解码为原始字符串的逻辑)。但老实说,我不相信这种方法,因为通过解码,您可能会得到一个在将其作为 url 的一部分插入后会被误解的字符串。

如果您的文本是服务器上“字典”的条目,那么我会在实体的“字典”中添加一个整数 Id 字段,并使用实体 ID 作为 web.API 的参数。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    相关资源
    最近更新 更多