ASP.NET URL 验证

Posted

技术标签:

【中文标题】ASP.NET URL 验证【英文标题】:ASP.NET URL validation 【发布时间】:2010-09-22 16:22:55 【问题描述】:

我们在 ASP.NET 上有一个自定义 REST 处理程序,它被配置为处理所有传入请求:

<add path="*" verb="*" type="REST.RESTProtocolHandler"/>

但是,将管道字符传递给它,无论是否正确编码,都会触发一个似乎来自 ASP.NET 内部的验证错误。

访问@987654321@@987654322@ 会产生此错误:

[ArgumentException:路径中有非法字符。] System.IO.Path.CheckInvalidPathChars(字符串路径)+7489125 System.IO.Path.Combine(字符串路径 1,字符串路径 2)+40 System.Web.Configuration.UserMapPath.GetPhysicalPathForPath(字符串路径,VirtualDirectoryMapping 映射)+114 System.Web.Configuration.UserMapPath.GetPathConfigFilename(String siteID, VirtualPath path, String& directory, String& baseName) +72 System.Web.Configuration.UserMapPath.MapPath(String siteID, VirtualPath path) +30 System.Web.Configuration.UserMapPath.MapPath(String siteID, String path) +31 System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath, Boolean permitNull) +297 System.Web.Hosting.HostingEnvironment.MapPathInternal(VirtualPath virtualPath, Boolean permitNull) +51 System.Web.CachedPathData.GetConfigPathData(String configPath) +341 System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +110 System.Web.HttpContext.GetFilePathData() +36 System.Web.HttpContext.GetConfigurationPathData() +26 System.Web.Configuration.RuntimeConfig.GetConfig(HttpContext 上下文)+43 System.Web.Configuration.CustomErrorsSection.GetSettings(HttpContext context, Boolean canThrow) +41 System.Web.HttpResponse.ReportRuntimeError(异常 e,布尔 canThrow,布尔 localExecute)+101 System.Web.HttpRuntime.FinishRequest(HttpWorkerRequest wr, HttpContext context, Exception e) +383

没有用户态代码被执行。这是某处的配置选项吗?在 IIS 7 和 VS Studio 的 2008 开发服务器上重现。

Stack Overflow 似乎可以处理此错误,看起来像为https://***.com/%7c 呈现动态生成的 404 MVC 页面。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我认为答案在您的堆栈跟踪中。该错误在 System.IO.Path.CheckInvalidPathChars() 调用中引发 - 这不是检查 Url,而是检查 IIS 所在的 Windows 文件系统。与其说是管道字符是 Url 非法,不如说是 DOS 非法。

如果您在 IIS 尝试在服务器上查找匹配路径之前拦截了 Url,我希望您可以处理此错误。这可能在于有一个重写规则或类似规则来查找和重写其中包含不需要的字符的 Url。

【讨论】:

【参考方案2】:

首先你需要修改 注册表:

http://support.microsoft.com/default.aspx?scid=kb;EN-US;826437

重启 IIS

瞧,它的工作原理。

但是我已经在 IIS7 上顺利完成了这项工作,但在 IIS6 上我得到了这个错误(路径中的非法字符)。

【讨论】:

【参考方案3】:

我有一个类似的程序可以拦截所有内容,并用管道尝试它会给我同样的错误。我认为它与 IIS 在知道谁来处理请求之前进行路径测试(mappath)有关。 您的处理程序是根(意味着所有调用),但我认为 IIS 的处理方式是通用的。

因此,我假设您无法在文件系统上使用的任何或大部分路径字符在 IIS 请求 (GET/POST) 时都会失败。

也许有人知道如何禁用 IIS 检查。根据错误,它似乎发生在您的 web.config 被读取之前,因为它试图找到正确的配置?,

也许可以使用您自己的错误页面作为重定向回您的处理程序?

【讨论】:

【参考方案4】:

尝试拦截 Global.asax 文件中的异常。在那里(Global.asax.cs)实现这个方法:

protected void Application_Error(Object sender, EventArgs e)

    Exception ex = Server.GetLastError();
    //do whatever you want with that exception
    //or get the url from the context, reformat and redirect

【讨论】:

我第一次看到这个帖子的时候就是这么想的,但是当我嘲笑它时,它似乎不起作用。【参考方案5】:

默认情况下,IIS 不允许 URL 中的某些字符并认为它们是非法的。这就是您的问题所在 - 它甚至不会调用您拥有的处理程序。据我所知,除了 Windows 注册表之外,没有其他地方可以配置通过 UI 接受哪些字符。我不知道你为什么要使用管道,但我认为这不是一个好习惯。至于错误页面 - you can always have your own error page 任何异常,让用户看不到丑陋的消息。

【讨论】:

如果你查看***.com/%7c,你会看到你收到了一个渲染页面(你的用户名是一个提示)所以一定有办法做到这一点。

以上是关于ASP.NET URL 验证的主要内容,如果未能解决你的问题,请参考以下文章

回发时“找不到指定的 URL”-asp.net windows 身份验证

ASP.NET-表单验证-DataAnnotations

ASP.Net 验证文化名称

使用 MVC 和 ASP.NET 身份进行 URL 授权

在 asp.net 核心中使用返回 url

Asp.net 表单身份验证登录循环