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的一个简单的解释和已经说过的东西的总结。
要求方:
- UrlEncode你的path。
- 用'!'replace'%'。
- 提出请求。
回应方:
- replace“!” 与'%'。
- UrlDecode你的path。
- 按照预期使用参数。
冲洗,重复,享受。
另一个选项是使用查询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。
- 在Asp.net MVC中抛出/返回一个404 actionResult或exception,并让IIS处理它
- 如何在ASP.NET MVC 3中创build自己的脚手架模板?
- 如何使用Moq模拟ASP.NET MVC中的HttpContext?
- ASP.NET 5 MVC:无法连接到Web服务器“IIS Express”
- MVC中的Last-Modified头
- 如何解决我的ASP.Net MVC应用程序iisreset后发生的AntiForgeryTokenexception?
- 使用ConfigurationManager从Web.Config读取密钥
- Windows Azure PaaS(networkingangular色)的真正替代品?
- 什么是一个ASP.NET MVC应用程序中的PreserveLoginUrl appSetting键/值?