URL中的URL编码斜线

我的地图是:

routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with params new { controller = "Home", action = "Index", id = "" } // Param defaults ); 

如果我使用URL http://localhost:5000/Home/About/100%2f200 ,则没有匹配的路由。 我将URL更改为http://localhost:5000/Home/About/100然后再次匹配路由。

有没有简单的方法来处理包含斜线的参数? 其他转义值(空格%20 )似乎工作。

编辑:

编码Base64为我工作。 它使得URL变得丑陋,但是现在没问题。

 public class UrlEncoder { public string URLDecode(string decode) { if (decode == null) return null; if (decode.StartsWith("=")) { return FromBase64(decode.TrimStart('=')); } else { return HttpUtility.UrlDecode( decode) ; } } public string UrlEncode(string encode) { if (encode == null) return null; string encoded = HttpUtility.PathEncode(encode); if (encoded.Replace("%20", "") == encode.Replace(" ", "")) { return encoded; } else { return "=" + ToBase64(encode); } } public string ToBase64(string encode) { Byte[] btByteArray = null; UTF8Encoding encoding = new UTF8Encoding(); btByteArray = encoding.GetBytes(encode); string sResult = System.Convert.ToBase64String(btByteArray, 0, btByteArray.Length); sResult = sResult.Replace("+", "-").Replace("/", "_"); return sResult; } public string FromBase64(string decode) { decode = decode.Replace("-", "+").Replace("_", "/"); UTF8Encoding encoding = new UTF8Encoding(); return encoding.GetString(Convert.FromBase64String(decode)); } } 

EDIT1:

最后certificate,最好的办法是保存一个很好的格式string,我需要select每个项目。 这好多了,因为现在我只编码值而不解码。 所有特殊字符变成“ – ”。 现在我的很多数据库表都有这个额外的列“URL”。 数据相当稳定,这就是为什么我可以这样做。 如果“URL”中的数据是唯一的,我甚至可以检查。

EDIT2:

同时注意空间的性格。 它在VS综合networking服务器上看起来不错,但在iis7上却不一样, 正确的URL编码空间字符

如果这只是你的最后一个参数,你可以这样做:

 routes.MapRoute( "Default", // Route name "{controller}/{action}/{*id}", // URL with parameters new { controller = "Home", action = "Index", id = "" }); // Parameter defaults 

在.NET 4.0 beta 2中,CLR团队提供了一种解决方法。

将此添加到您的web.config文件中:

 <uri> <schemeSettings> <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> </schemeSettings> </uri> 

这将导致Uri类根据描述URI的RFC行为,允许斜线在path中转义而不被转义。 CLR团队出于安全原因报告说他们偏离了规范,并且在.config文件中进行设置基本上使您可以在不使用斜线的情况下,承担所涉及的其他安全考虑。

下面是解决scheme的一个简单的解释和已经说过的东西的总结。

要求方:

  1. UrlEncode你的path。
  2. 用'!'replace'%'。
  3. 提出请求。

回应方:

  1. replace“!” 与'%'。
  2. UrlDecode你的path。
  3. 按照预期使用参数。

冲洗,重复,享受。

另一个选项是使用查询string值。 非常蹩脚,但比自定义编码更简单。

 http://localhost:5000/Home/About?100%2f200 

Java / Tomcat也一样。

如果您的url中有编码的“/”(%2F),则仍然存在问题。

RFC 3986 – 第2.2节说:“如果URI组件的数据与保留字符作为分隔符的用途相冲突,那么冲突数据必须在URI形成之前进行百分比编码。 (RFC 3986 – 第2.2节)

但是Tomcat有一个问题:

http://tomcat.apache.org/security-6.html – 在Apache Tomcat 6.0.10中修复

重要的是:目录遍历CVE-2007-0450

Tomcat允许'\','%2F'和'%5C'[…]

以下Java系统属性已添加到Tomcat中,以提供对URL中path分隔符处理的额外控制(两个选项默认为false):

  • org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:true | false
  • org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH:true | false

由于不能保证所有的URL都是由Tomcat处理的,因为它们在代理服务器中,Tomcat应该总是保密,就像没有使用代理限制上下文访问一样。

影响:6.0.0-6.0.9

所以如果你有一个带有%2F字符的URL,Tomcat会返回:“400无效的URI:noSlash”

您可以在Tomcat启动脚本中切换错误修复:

 set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true 

您可以避免上述的双重编码/解码build议,只需使用HttpServerUtility.UrlTokenEncode和相应的UrlTokenDecode即可。

这对于.NET 4来说很有趣。无论如何,这个链接描述了RFC 1738,并且包括哪些字符需要编码,哪些只是“不安全的”。 链接文本

如果我想要一个search引擎优化友好的url(例如当你想把一个论坛post主题在url),是跳过编码,并取代任何不是AZ,az,0-9。

 public static string CreateSubjectSEO(string str) { int ci; char[] arr = str.ToCharArray(); for (int i = 0; i < arr.Length; i++) { ci = Convert.ToInt32(arr[i]); if (!((ci > 47 && ci < 58) || (ci > 64 && ci < 91) || (ci > 96 && ci < 123))) { arr[i] = '-'; } } return new string(arr); } 

正如Symfony 1.x开发者所面对的问题(+在urlencode() PHP注释中提到的):

  • urlencode()之前将'/'编码为'%2F'
  • 在(如有必要)之后将'%2F'解码为'/' urldecode()

注意:你可以使用rawurlencode() ,但是你仍然需要urlencode'/'两次。

优点:

  • 避免需要额外的转义过程(如果用'!'或'_'等特殊字符replace'/')
  • 不要依赖任何服务器设置,例如AllowEncodedSlashes for Apache

只需使用Server.UrlDecode 。 它会工作,我已经testing。