ASP.Net URL编码(ASP.Net URL Encoding)

2019-09-24 02:41发布

我在执行URL在ASP.net和重写我的网址是造成我的问题的世界。

该URL是从部门和类别的数据库生成的。 我希望员工能够将项目添加到与任何特殊字符都没有的破网站相应的数据库。

我构建的URL之前我编码数据。

有几个问题...

  1. 它达到.NET使其无法正常使用“/”,在它解析任何东西之前IIS解码URL。
  2. ASP.net获取由URL建设“〜”的某些网页中无用的困惑
  3. 我从内置的测试服务器,以我的本地IIS服务器(XP机)和含有编码与(26%)的任何URL移植给了我一个“错误的请求”的错误。
  4. 以UrlEncode留下一些断字无动于衷如“”

我确实对这个问题的另外两个相关的帖子,当时我只看到了小问题不是大问题上游。 我发现一些注册表技巧来解决“错误的请求”的问题,但我会被部署到一个共享的托管环境使得无用。 我也知道,这是一些安全问题的解决办法,所以我不想一定绕过它不知道的蠕虫可以,我开什么。

而不是试图迫使.NET传给我的原始URL,或覆盖IIS设置我想做出真正安全的URL在首位。

我会注意到我已经试过AntiXss.URLEncode,HttpUtility.URLEncode,URI.EscapeDataString。 我甚至试过愚蠢的事情如双URLEncodng。 是否有一个实用程序,做什么,我需要的,还是我真的需要推出自己的。 我甚至在考虑做一些哈克像人物的一个不寻常的字符串替换%。 最终的结果应至少可读这是使用URL首先重写的点。

很抱歉的长期后我只是想确保我已经包括了所有必要的细节。 我似乎无法找到关于此的任何相关信息,而且好像这将是一个共同的问题 - 所以也许我失去了一些东西大。 感谢您的帮助和耐心,与长解释!


编辑清晰:

当我说的网址正在从数据库建立我的意思是,目录结构是从我的数据库中的部门和类别contstructed。

部分网址示例 -

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

这些问题进来时,我使用像“饮料与酒吧”或“糕点/装饰”一个部门来构建我的网址。 尽管是第一次编码这些造成上述问题。

我的处理程序已经实施和工作除特殊字符编码问题的罚款。

Answer 1:

你应该考虑关闭它针对每个目录的唯一URL您的类别/部门表的表。 然后你可以使用一个特殊的程序来生成的网址。 这可以是一个SQL标量函数或CLR函数,但的东西它会做一个标准化的网页的URL。 您可以将“饮料与酒吧”到“饮料,而酒吧”和“糕点/装饰”到“糕点装潢”。 主要的日常需要用别的东西来代替全部无效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增强功能,或运行URL生成作为一个单独的进程。 然后执行映射,你会整个URL直接映射到一个类别ID。 这种做法从长远来看,有以下几个原因更好。 首先,你是不是总是生成的URL,你这样做一次,他们保持静态,你不必担心你的程序变化,然后Googlebot不要能够找到旧网址。 另外,如果你得到冲突,你可能会注意到一个潜在的重复类别名称,因为冲突只会通过特殊字符不同。 最后,您可以随时查看与数据库的网址,而不必运行映射功能。



Answer 2:

我有一个URL重写我在开始验证的请求Global.asax文件执行,因为我有一些安全。 这是我拿的原始URL,然后进行数据库查询。 这则重写路径aspx页面,所有的参数都是通过查询字符串传递。 没有编码是必要的。

但是,如果您使用的是URL实际更改数据,那么我可以看到,你将有巨大的问题,你是如何有效使用的HTTP GET来更改数据库。 它通常是concidered坏idead,而不是我做的。

我只用POST请求做任何操作DATABSE。 这使URL干净所有的数据都在页面形式。

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

如果它是导致该问题,则类别名称也许你应该限制名称阿尔法只有数字字符和换空间为“ - ”。 IIS将引发与周期的不稳定“” 因为它看起来的文件名。

PS IIS不理解波浪“〜”,这是后话,编译器理解。 所以,如果你在一个锚标记使用它作为预期它不会工作,你应该使用,而不是波浪线应用程序的根。

编辑:

OK,它看起来像与具有一定的字符,如IIS问题的问题。 /和&。 即使你的URLEncode这些IIS仍然会尽力实现自己的含义。 因此考虑删除它们,以便:

饮料和酒吧变得BeverageBar

糕点/装饰变得PastryDecorating。

这将让你的URL干净,但并不意味着在数据库中的一个额外的列,因此您可以cheack对缩短的类别名称对应的URL。



Answer 3:

我有完全相同的问题。 感谢写起来这么好听。 它实际上帮助我更好地理解这个问题。

我有一些其他方面的考虑。然而。 其中一个我的目标是支持任何字符是其是基于文章的标题链接的潜力。 此外,我希望确保在编码和双向编码/解码过程中的独特性。

所以我做了一些手工编码来解决这个问题。 这不会完全消除编码%,但会大大降低,并保持用户生成一个不可访问的URL。 我的过程开始使用Server.URLEncode函数。 但是,这并不排除在URL中的问题。 因为IIS被解码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


Answer 4:

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

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


文章来源: ASP.Net URL Encoding