ASP.Net URL编码

我正在ASP.net中实现URL重写,我的URL导致我的问题世界。

URL是从部门和类别的数据库生成的。 我希望员工能够使用适当的特殊字符向数据库添加项目,而不会破坏站点。

我在构造URL之前编码数据。

有几个问题……

  1. IIS在到达.net之前对URL进行解码,因此无法正确解析其中包含“/”的任何内容。
  2. ASP.net被某些页面中的“〜”无效的url搞糊涂了
  3. 我从内置测试服务器迁移到我的本地IIS服务器(XP机器),任何包含编码&(%26)的URL都会给我一个“错误请求”错误。
  4. UrlEncode留下一些破碎的字符,如’。’

我确实有两个关于这个主题的相关post,当时我只看到小问题不是上游的大问题。 我发现了一些注册表技巧来解决“错误请求”问题,但我将部署到共享托管环境,使其无用。 我也知道这是一个解决某些安全问题的方法所以我不想在不知道我正在打开什么样的蠕虫的情况下绕过它。

而不是试图强制.net传递原始URL,或覆盖IIS设置,我想首先制作真正安全的URL。

我会注意到我已经尝试过AntiXss.URLEncode,HttpUtility.URLEncode,URI.EscapeDataString。 我甚至尝试过双重URLEncodng等愚蠢的事情。 是否有一个实用程序可以满足我的需要,或者我真的需要自己动手。 我甚至考虑做一些Hacky,比如用一些不寻常的字符替换%。 最终结果应至少是可读的,这是首先使用URL重写的重点。

很抱歉很长的post – 我只是想确保我已经包含了所有必要的细节。 我似乎无法找到任何相关信息,这似乎是一个常见的问题 – 所以也许我错过了一些大事。 感谢您的帮助,以及对长篇解释的耐心!


为清晰起见编辑:

当我说从数据库构建url时,我的意思是目录结构是从我的数据库中的部门和类别构建的。

一些示例URLS –

的MyStore /制冷/酒吧+ Fridge.aspx
的MyStore /烹饪+ Equipment.aspx
的MyStore /厨房/切割+ Boards.asxpx

当我使用像“Beverage&Bar”或“Pastry / Decorating”这样的部门来构建我的URL时会出现问题。 尽管首先编码这些导致上述问题。

除了特殊的字符编码问题外,我的处理程序已经实现并且工作正常。

您应该考虑从您的类别/部门表中选择一个表,该表具有每个类别的唯一URL。 然后,您可以使用特殊例程来生成URL。 这可以是SQL标量函数或CLR函数,但它要做的一件事就是规范化Web的URL。 您可以将“Beverage&Bar”转换为“Beverage-And-Bar”和“Pastry / Decorating”转换为“Pastry-Decorating”。 主要是,例程需要用其他东西替换所有无效的HTTP URL字符。 一个例子是:

public static class URL { static readonly Regex feet = new Regex(@"([0-9]\s?)'([^'])", RegexOptions.Compiled); static readonly Regex inch1 = new Regex(@"([0-9]\s?)''", RegexOptions.Compiled); static readonly Regex inch2 = new Regex(@"([0-9]\s?)""", RegexOptions.Compiled); static readonly Regex num = new Regex(@"#([0-9]+)", RegexOptions.Compiled); static readonly Regex dollar = new Regex(@"[$]([0-9]+)", RegexOptions.Compiled); static readonly Regex percent = new Regex(@"([0-9]+)%", RegexOptions.Compiled); static readonly Regex sep = new Regex(@"[\s_/\\+:.]", RegexOptions.Compiled); static readonly Regex empty = new Regex(@"[^-A-Za-z0-9]", RegexOptions.Compiled); static readonly Regex extra = new Regex(@"[-]+", RegexOptions.Compiled); public static string PrepareURL(string str) { str = str.Trim().ToLower(); str = str.Replace("&", "and"); str = feet.Replace(str, "$1-ft-"); str = inch1.Replace(str, "$1-in-"); str = inch2.Replace(str, "$1-in-"); str = num.Replace(str, "num-$1"); str = dollar.Replace(str, "$1-dollar-"); str = percent.Replace(str, "$1-percent-"); str = sep.Replace(str, "-"); str = empty.Replace(str, string.Empty); str = extra.Replace(str, "-"); str = str.Trim('-'); return str; } } 

您可以将其设置为SQL增强function,或将URL生成作为单独的进程运行。 然后,要实现映射,您可以将整个URL直接映射到类别ID。 从长远来看,这种方法有好几个原因。 首先,您并不总是生成url,您执行此操作一次并保持静态,您不必担心程序更改,然后GoogleBot无法找到旧url。 此外,如果发生碰撞,您可能会注意到潜在的重复类别名称,因为碰撞只会因特殊字符而异。 最后,您始终可以从数据库中查看URL,而无需运行映射function。

我有一个url重写我在开始validation请求的global.asax文件中实现,因为我有一些安全性。 这是我获取原始URL然后进行数据库查找的地方。 然后重写aspx页面的路径,所有参数都通过查询字符串传递。 不需要编码。

但是,如果您使用url实际更改数据,那么我可以看到,当您有效地使用http GET更改数据库时,您将遇到大问题。 它通常被认为是一个糟糕的想法,而不是我做的事情。

我只使用post请求进行任何数据库操作。 这样可以保持url清晰,因为所有数据都在页面中。

我唯一的问题是设置正确的url到page.form.action,在大多数情况下,它是原始url。

如果它的类别名称导致问题,那么也许您应该仅将名称限制为字母数字字符并将空格换成“ – ”。 IIS将使用句点“。”摇摆不定。 因为它寻找文件名。

PS IIS不理解代字号“〜”,这是编译器理解的东西。 因此,如果您在锚标记中使用它,它将无法按预期工作,您应该使用应用程序根而不是代字号。

编辑:

好吧,看起来IIS的问题与某些字符有问题,例如。 /和&。 即使你做urlencode这些IIS仍然会尝试实现自己的意义。 因此,考虑删除它们:

饮料和酒吧成为BeverageBar

糕点/装饰成为PastryDecorating。

这将使您保持url清洁,但确实意味着数据库中有一个额外的列,因此您可以根据此缩短的类别名称来填充url。

我有完全相同的问题。 谢谢你写得这么好。 它实际上帮助我更好地理解了这个问题。

然而,我有其他一些考虑因素。 我的目标之一是支持任何字符在URL中的可能性,该URL基于文章的标题。 另外,我想确保编码的唯一性和双向编码/解码过程。

所以我做了一些手动编码来解决这个问题。 这不会完全消除百分比编码,但会大大减少编码,并防止用户生成无法访问的URL。 我的过程从使用Server.URLEncode函数开始。 但这并没有消除url中的问题。 因为IIS正在解码URL然后将其传递给应用程序,所以某些字符会因危险的请求exception而中断它。 这些字符包括+, &, /, !, *, ., () 。 所以在这些字符和其他字符上我想使其更具可读性我会对更有用的url进行双重编码。 编码也很难,因为url中允许的字符数量有限。 因此,在编码之前,我将所有字母设为大写,然后使用小写进行编码。 这使它不能完全解码,但我可以轻松地在数据库或代码中进行匹配,使我希望匹配的值为大写。

好吧,这是我的代码。 反馈将不胜感激。 哦,是的,这是在VB,但事情应该转移到C#很容易。

 Dim strReturn As String = Trim(strStringToEncode) strReturn = Server.UrlEncode(strReturn) strReturn = strReturn.Replace("-", "dash").Replace("+", "-") strReturn = strReturn.Replace("%26", "and"). Replace("%2f", "or"). Replace("!", "excl"). Replace("*", "star"). Replace("%27", "apos"). Replace("(", "lprn"). Replace(")", "rprn"). Replace("%3b", "semi"). Replace("%3a", "coln"). Replace("%40", "at"). Replace("%3d", "eq"). Replace("%2b", "plus"). Replace("%24", "dols"). Replace("%25", "pct"). Replace("%2c", "coma"). Replace("%3f", "query"). Replace("%23", "hash"). Replace("%5b", "lbrk"). Replace("%5d", "rbrk"). Replace(".", "dot"). Replace("%3e", "gt"). Replace("%3c", "lt") Return strReturn 

我想你正在寻找HttpUtility.UrlEncodeHttpUtility.HtmlDecode

 string url = "http://www.google.com/search?q=" + HttpUtility.UrlEncode("Example");