双/不完整参数URL编码

时间:2008-10-27 15:08:55

标签: c# asp.net-mvc encoding

在我的网络应用程序中,我的参数可以包含各种疯狂的字符(俄语字符,斜杠,空格等),因此不能总是在URL中表示为。 以快乐的方式发送它们将在大约50%的情况下起作用。像空格这样的东西已经在某处编码了(我猜是在Html.BuildUrlFromExpression中)。其他的东西(比如“/”和“*”)不是。

现在我不知道该怎么做了,因为如果我自己编码,我的编码将再次被部分编码并最终出错。如果我不对它们进行编码,则某些字符将无法通过。

我所做的是手动.replace()我遇到问题的人物。
这当然不是一个好主意。

想法?

- 编辑 -
我知道我可以使用多种编码/解码库。 它看起来像mvc框架已经在尝试为我做,但不完全。

<a href="<%=Html.BuildUrlFromExpression<SearchController>(c=>c.Search("", 1, "a \v/&irdStr*ng"))%>" title="my hat's awesome!">

会渲染我

<a href="/Search.mvc/en/Search/1/a%20%5Cv/&irdStr*ng" title="my hat's awesome!">

注意正斜杠,星号和&符号不会被转义。 为什么有些人逃脱而其他人没有逃脱?我怎么能正确地逃避这个?

我做错了什么还是框架?

8 个答案:

答案 0 :(得分:2)

应使用Uri.EscapeDataString转义参数:

            string url = string.Format("http://www.foo.bar/page?name={0}&address={1}",
                Uri.EscapeDataString("adlknad /?? lkm#"),
                Uri.EscapeDataString(" qeio103 8182"));

            Console.WriteLine(url);
            Uri uri = new Uri(url);
            string[] options = uri.Query.Split('?','&');
            foreach (string option in options)
            {
                string[] parts = option.Split('=');
                if (parts.Length == 2)
                {
                    Console.WriteLine("{0} = {1}",parts[0],
                        Uri.UnescapeDataString(parts[1]));
                }
            }

答案 1 :(得分:1)

正如其他人所提到的,如果您首先对字符串进行编码,则可以解决问题。

MVC框架正在编码它知道需要编码的字符,但保留那些有效的URL字符(例如&amp;%?* /)。这是因为它们是有效的URL字符,尽管它们是URL中的特殊字符,可能无法实现您所追求的结果。

答案 2 :(得分:0)

您是否尝试使用Server.UrlEncode()方法进行编码,并使用Server.UrlDecode()方法进行解码?

使用它来传递物品我没有任何问题。

答案 3 :(得分:0)

Server.URLEncodeHttpServerUtility.UrlEncode

我现在看到你在说什么 - 我没有意识到这个问题是针对MVC的。看起来像MVC框架的那一部分的限制 - 特别是BuildUrlFromExpression正在进行一些URL编码,但是它知道还需要一些这些标点作为框架URL的一部分。

而且不幸的是,URLEncoding不产生不变量,即

URLEncode(x) != URLEncode(URLEncode(x))

那不是很好。然后你可以对你的变量进行预编码,它们不会被双重编码。

可能有一个ASP.NET MVC框架的最佳实践。我想你可以做的另一件事是编码到base64或URLEncode-invariant。

答案 4 :(得分:0)

尝试使用Microsoft Anti-Cross Site Scripting library。它包含几种编码方法,它们编码所有字符(包括#和其他语言中的字符)。至于解码,浏览器应该很好地处理编码的Url,但是如果你需要手动解码Url,请使用Uri.UnescapeDataString

希望有所帮助。

答案 5 :(得分:0)

出于安全原因,禁止在URL的路径部分中转发正斜杠和点(尽管它以单声道工作)。

答案 6 :(得分:0)

Html.BuildUrlFromExpression需要修复,然后将此上游提交给MVC项目...或者在传递给BuildUrlFromExpression之前对字符串进行编码,并在另一侧返回时对其进行解码。

它可能不容易修复,因为IIS可能事先正在处理url字符串的解码...可能需要对实用程序方法中的替代路径字符进行更高级的编码/解码,并代表您进行解码出。

答案 7 :(得分:0)

我在这上面看过类似的帖子。对我而言,它看起来像是MVC中的一个缺陷。该函数将更恰当地命名为“BuildUrlFromEncodedExpression”。更糟糕的是,被调用的函数需要解码其输入参数。育。

如果编码BuildUrlFromExpression()的字符和调用者编码的字符之间有任何重叠(我认为,为了简单起见,我认为可能只编码任何非字母数字),那么你就有可能出现令人讨厌的错误。