15

Base64 文字列を QueryString 経由で C#.Net Web アプリケーションに渡そうとしています。文字列が到着すると、「+」(プラス) 記号がスペースに置き換えられます。自動 URLDecode プロセスがこれを行っているようです。QueryString を介して渡されるものを制御することはできません。このサーバー側を処理する方法はありますか?

例:

http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

プロデュース:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

人々はクエリ文字列の URLEncoding を提案しています:

System.Web.HttpUtility.UrlEncode(yourString) 

呼び出しルーチンを制御できないため、これを行うことはできません (他の言語では正常に動作しています)。

スペースをプラス記号に置き換えるという提案もありました。

Request.QueryString["VLTrap"].Replace(" ", "+");

私はこれについて考えていましたが、私の懸念は、プラス記号に加えて、他のどの文字が不正な形式である可能性があるのか​​ わからないということです。

私の主な目標は、デコーダーを通過する前に QueryString をインターセプトすることです。

この目的のために Request.QueryString.toString() を調べてみましたが、これには同じ不正な情報が含まれていました。URLDecoded される前に生の QueryString を見る方法はありますか?

さらにテストした結果、.Net は QuerString からのすべての着信が URL エンコードされていることを期待しているように見えますが、ブラウザーは GET 要求を自動的に URL エンコードしません。

4

11 に答える 11

14

提案された解決策:

Request.QueryString["VLTrap"].Replace(" ", "+");

うまくいくはずです。あなたの懸念について:

私はこれについて考えていましたが、私の懸念は、プラス記号に加えて、他のどの文字が不正な形式である可能性があるのか​​ わからないということです。

これは、 base64 について読むことで簡単に軽減できます。最新の base64 で有効な英数字以外の文字は、「/」、「+」、および「=」のみです (パディングにのみ使用されます)。

これらのうち、"+" は URL のエスケープ表現として特別な意味を持つ唯一のものです。他の 2 つは URL で特別な意味を持ちますが (パスの区切り記号とクエリ文字列の区切り記号)、問題になることはありません。

だから大丈夫だと思います。

于 2008-10-16T08:09:35.840 に答える
11

手動で値 ( ) を置き換えるか、 (さらに良いのは HttpRequest.Url.Query) をargument.Replace(' ', '+')調べて、自分で解析することができます。HttpRequest.ServerVariables["QUERY_STRING"]

ただし、URL が指定されている場合の問題を解決する必要があります。プラス記号は URL で "%2B" としてエンコードする必要があります。

インバウンド URL を制御しない場合は、最初のオプションが優先されます。これにより、ほとんどのエラーが回避されます。

于 2008-09-23T21:29:48.013 に答える
4

URL を制御できることを除いて、まったく同じ問題が発生しています。私のクエリ文字列は次のようになりますが、Server.URLDecodeand を使用しても記号にServer.URLEncode変換されません。+

http://localhost/childapp/default.aspx?TokenID=0XU%2fKUTLau%2bnSWR7%2b5Z7DbZrhKZMyeqStyTPonw1OdI%3d

以下を実行すると。

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);

%2bそれはまだ背中を+記号に変換しません。代わりに、次のことを行う必要があります。

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);
tokenID = tokenID.Replace(" ", "+");

その後、正しく動作します。本当に奇妙です。

于 2011-01-26T10:52:35.607 に答える
2

Base64値を含むパラメーターと「+」が付いているパラメーターで同様の問題が発生しました。Request.QueryString["VLTrap"].Replace(" ", "+"); のみ。私にとってはうまくいきました。UrlEncode やその他のエンコーディングは役に立ちません。「%2b」としてエンコードされた「+」を使用して自分でページにエンコードされたリンクを表示した場合でも、最初に表示されたときに「+」に変更され、クリックするとブラウザーが変更されるためです。それを空きスペースに。したがって、自分でリンクを表示しても、元のポスターが言うようにそれを制御する方法はありません. HTMLメールでもそのようなリンクと同じこと。

于 2012-01-20T11:01:08.163 に答える
2

使用System.Uri.UnescapeDataString(yourString)すると、 は無視され+ます。このメソッドは、クライアントまたはサーバーで何らかの従来のアプローチを使用して文字列がエンコードされた場合のような場合にのみ使用する必要があります。

このブログ投稿を参照してください: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx

于 2014-04-01T17:35:12.280 に答える
1

URL に追加する前に文字列を URLEncode すると、これらの問題は発生しません (自動 URLDecode により元の状態に戻ります)。

于 2008-09-23T21:26:21.750 に答える
1

サーバーに送信する前に、Base64 文字列 URLEncoded を取得する必要があります。
それができない場合は、埋め込まれたスペースを + に戻すことをお勧めします。b64 文字列にはスペースを含めることは想定されていないため、これは正当な戦術です...

于 2008-09-23T21:29:00.090 に答える
1

System.Web.HttpUtility.UrlEncode(yourString)トリックを行います。

于 2008-09-23T21:31:35.200 に答える
1

簡単なハックとして、base64 デコードの前にスペースをプラス文字に置き換えることができます。

于 2008-09-23T21:34:21.823 に答える
0

私は決して C# 開発者ではありませんが、Base64 文字列を URL として送信する前にエンコードする必要があるようです。

于 2008-09-23T21:27:34.117 に答える
0

スペースを + と見なして置き換えることはできませんか?

Request.QueryString["VLTrap"].Replace(" ", "+");

;)

于 2008-09-23T21:27:34.913 に答える