ASP.Net:尝试处理http://localhost:5957/http://yahoo.com时出现HTTP 400错误请求错误

4
我正在尝试创建类似于diggbar的东西。
我正在使用Visual Studio 2010和Asp开发服务器。
但是,我无法让ASP dev服务器处理该请求,因为路径中包含“http:”。 我尝试创建HTTPModule在BeginRequest中重写URL,但当URL为http://localhost:5957/http://yahoo.com时,事件处理程序不会被调用。如果URL为http://localhost:5957/http/yahoo.com,则事件处理程序会被调用。
总结一下: 有什么想法吗?

7
给一个答案打个标记怎么样? - Scott Hanselman
12个回答

13

7

来自ASP.Net团队的Stefan:http://forums.asp.net/p/1431148/3221542.aspx

在当前版本的ASP.NET中,包含冒号等字符的URL将被拒绝作为潜在的安全威胁。历史原因是底层NTFS文件系统支持可通过名称访问的备用资源流,例如“yourfile.txt:hiddendata.txt”。从Url中阻止冒号字符可以防止编写不良应用程序意外使用备用资源流。

在当前版本的ASP.NET中还存在一个限制,即传入的Url需要映射到NTFS文件系统,以确定托管配置数据。

在ASP.NET 4中,可以选择性地删除这些限制。然而,这些更改仅在ASP.NET 4的Beta 2 版中提供 - 在Beta 1中不存在。我们尝试了本论坛帖子中列出的Url,并确认使用我们内部构建的ASP.NET 4可以使用该样式的Url并在没有任何400错误的情况下处理它。

- Stefan


5

来自 ASP.Net 团队的 Stefan:

以下内容摘自即将发布的 Beta 2 的 "新功能" 文档:

ASP.NET 4 引入了扩展允许应用程序 Url 范围的新选项。最简单和最有用的更改是,ASP.NET 给开发人员提供了允许更长的 Url 的选项。以前的版本将 Url 路径长度限制为260个字符(NTFS 文件路径限制)。在 ASP.NET 4 中,开发人员可以使用两个新的 httpRuntime 配置属性增加(或减少)Url 的限制,以适应其应用程序:

修改 "maxRequestPathLength" 的值以允许更长或更短的 Url 路径(Url 除协议、服务器和查询字符串部分之外的部分)。修改 "maxQueryStringLength" 的值以允许更长或更短的查询字符串。

ASP.NET 4 还认可开发人员调整 ASP.NET Url 字符检查所使用的字符集。当 ASP.NET 在 Url 的路径部分中发现无效字符时,它会拒绝请求并返回 HTTP 400 错误。在之前的版本中,Url 字符检查仅限于一组固定的字符。在 ASP.NET 4 中,开发人员可以使用另一个新的 httpRuntime 配置属性自定义字符检查集合:

默认情况下,“requestPathInvalidChars”属性包含七个被认为是无效的字符(小于号和大于号以及&符号已编码,因为配置是 Xml 文件)。然后,开发人员可以根据其应用程序的需求扩展或减少无效字符集合。请注意,ASP.NET 4 仍将拒绝包含 ASCII 字符范围为0x00-0x1F的任何 Url 路径,因为这些字符被认为是无效的 Url 字符(RFC 2396 认为这些字符是无效的,在运行 IIS6 或更高版本的 Windows 服务器上,http.sys 协议设备驱动程序也会自动拒绝带有这些字符的 Url)。

  • Stefan

3
我在为ASP.net创建URL缩短器时遇到了这个问题。我无论如何都无法使冒号以一种ASP接受的方式进行编码,不管是使用HttpUtility.UrlEncode还是客户端的javascript的escape()。

我的解决方案是进行Base64编码。将整个内容转换为非争议性的字母数字字符。然后在服务器上进行解码。我使用了这些函数

此外,我创建了一个HttpModule来通过前导连字符触发,以便知道要处理后面的内容作为要解码的URL。如果您需要进一步的细节,请与我联系。


1
Base64编码/解码是一种聪明的方法,但它确实会导致一些难看的URL。 - Scott Mitchell

0
一个快速的开发环境解决方案:
  • 将 Web 项目属性更改为“使用 IIS 本地服务器”,并选中“使用 IIS Express”(这将保留 VS Dev Server 的 URL)。

  • <system.web> 中的 Web.config 中添加以下设置:

    <httpRuntime requestPathInvalidCharacters="" />
    

对于生产部署,请考虑其他答案中提到的安全注意事项。


0

KB文章826437(http://support.microsoft.com/kb/826437)包含了你的问题的答案。

  1. 确保机器上安装了Microsoft .NET 1.1 SP1
  2. 在注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET中创建一个32位DWORD值VerificationCompatibility = 1
  3. 重新启动IIS。

这对我有用(IIS 6,ASP.NET 4),可能对你也有用。


0

我在这里回答了一个类似的问题。

https://dev59.com/3WLVa4cB1Zd3GeqPwnYO#12037000

基本上,ASP.net 只接受在问号之后编码的字符,比如冒号。幸运的是,ASP.net MVC在默认映射中自动将/api/persons/xxxx和/api/persons?id=xxxx两者都映射到相同的位置,所以我最终采取了这种方式。

0

尝试使用 HttpUtility.UrlPathEncode(url) - MSDN文档


0

在重定向到字符串之前,您需要使用HttpUtility.UrlEncode对其进行编码。


问题在于用户将字符串输入到浏览器地址栏中。因此,例如,用户可能会输入http://digg.com/http://cnn.com。在这种情况下,没有机会对URL进行编码。 - mat3

0

我不确定digg正在使用哪个Web服务器,但我敢打赌这在IIS或VS内置的Web服务器中根本不可能实现。最有可能的是它是一个可以修改以允许各种古怪URL的Web服务器。


是的,看起来请求似乎在 Web 服务器层被拒绝了。虽然这似乎是一个奇怪的限制。有没有微软 IIS/ASP.Net 的人可以解释一下这个限制是否存在于代码库中? - mat3
Spencer, 感谢你修复URL。在页面顶部还有一个错误的链接:http://digg.com/cttp://cnn.com。非常感谢。 - mat3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接