7

In my web app, my parameters can contain all sorts of crazy characters (russian chars, slashes, spaces etc) and can therefor not always be represented as-is in a URL.
Sending them on their merry way will work in about 50% of the cases. Some things like spaces are already encoded somewhere (I'm guessing in the Html.BuildUrlFromExpression does). Other things though (like "/" and "*") are not.

Now I don't know what to do anymore because if I encode them myself, my encoding will get partially encoded again and end up wrong. If I don't encode them, some characters will not get through.

What I did is manually .replace() the characters I had problems with.
This is off course not a good idea.

Ideas?

--Edit--
I know there are a multitude of encoding/decoding libraries at my disposal. It just looks like the mvc framework is already trying to do it for me, but not completely.

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

will render me

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

Notice how the forward slash, asterisk and ampersand are not escaped. Why are some escaped and others not? How can I now escape this properly?

Am I doing something wrong or is it the framework?

4

8 に答える 8

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]));
                }
            }
于 2008-10-27T15:16:49.023 に答える
1

他の人が述べたように、最初に文字列をエンコードすると、問題を回避できます。

MVC フレームワークは、エンコードする必要があることがわかっている文字をエンコードしますが、有効な URL 文字 (& % ? * / など) は残します。これは、これらが有効な URL 文字であるためです。ただし、これらは URL 内の特別な文字であり、目的の結果が得られない可能性があります。

于 2008-12-23T09:16:17.200 に答える
0

Html.BuildUrlFromExpressionを修正する必要があり、これをMVCプロジェクトにアップストリームで送信します...または、BuildUrlFromExpressionに渡す前に文字列にエンコードを行い、反対側に戻ってきたときにデコードします。

IISがURL文字列のデコードを事前に処理している可能性があるため、簡単に修正できない場合があります...ユーティリティメソッドの代替パス文字に対してより高度なエンコード/デコードを実行し、ユーザーに代わってデコードする必要がある場合があります。

于 2008-12-19T06:41:14.073 に答える
0

URL のパス部分のスラッシュとドットのエスケープは、セキュリティ上の理由から禁止されています (ただし、mono では機能します)。

于 2008-11-03T10:11:51.220 に答える
0

これに似たような投稿を見たことがあります。私には、MVC の欠陥のように見えます。関数は、より適切に「BuildUrlFromEncodedExpression」という名前になります。さらに悪いことに、呼び出された関数は入力パラメーターをデコードする必要があります。ユク。

BuildUrlFromExpression() でエンコードされた文字と呼び出し元によってエンコードされた文字との間に重複がある場合 (簡単にするために、英数字以外をエンコードするだけでよいと思います)、厄介なバグが発生する可能性があります。

于 2008-12-24T18:48:43.487 に答える
0

Server.UrlEncode()エンコードを行うServer.UrlDecode()メソッドとデコードするメソッドを使用してみましたか?

アイテムの受け渡しに使用しても問題はありませんでした。

于 2008-10-27T15:13:07.110 に答える
0

Server.URLEncodeまたはHttpServerUtility.UrlEncode

あなたの言っていることがわかりました-質問がMVCに固有のものであることに気づきませんでした。MVC フレームワークのその部分の制限のように見えます-特に BuildUrlFromExpression はいくつかの URL エンコーディングを行っていますが、フレームワーク URL の一部としてこれらの句読点の一部も必要であることを認識しています。

残念なことに、URLEncoding は不変条件を生成しません。つまり、

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

それはいいですね。次に、変数を事前にエンコードすると、二重にエンコードされなくなります。

おそらく、これには ASP.NET MVC フレームワークのベスト プラクティスがあります。あなたができるもう1つのことは、base64またはURLEncode不変のものにエンコードすることだと思います。

于 2008-10-27T15:13:35.143 に答える
0

Microsoft Anti-Cross Site Scripting ライブラリを使用してみてください。これには、すべての文字 (# および他の言語の文字を含む) をエンコードするいくつかの Encode メソッドが含まれています。デコードに関しては、ブラウザーはエンコードされた Url を適切に処理する必要がありますが、手動で Url をデコードする必要がある場合は、Uri.UnescapeDataStringを使用してください。

それが役立つことを願っています。

于 2008-10-27T15:19:07.723 に答える