URLDecode 後の QueryString の形式が不正です
質問
QueryString を介して Base64 文字列を 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() を調べてみましたが、これには同じ不正な情報が含まれていました。生のQueryStringを確認する方法はありますか 前に URLデコードされていますか?
さらにテストした結果、.Net は QuerString から受信するすべてが URL エンコードされることを期待しているようですが、ブラウザーは GET リクエストを自動的に URL エンコードしません。
解決
値を手動で置き換えることもできます (argument.Replace(' ', '+')
)または相談してください。 HttpRequest.ServerVariables["QUERY_STRING"]
(さらに良いのは HttpRequest.Url.Query)、それを自分で解析します。
ただし、URL が指定されている問題を解決するように努める必要があります。プラス記号は URL 内で「%2B」としてエンコードする必要があります。それ以外の場合、プラスはスペースを表すためです。
受信 URL を制御しない場合は、ほとんどのエラーを回避できる最初のオプションが推奨されます。
他のヒント
提案される解決策:
Request.QueryString["VLTrap"].Replace(" ", "+");
問題なく動作するはずです。あなたの懸念については:
このことについては考えていましたが、それに関する私の懸念は、プラス記号以外にどのような文字が不正になるかわからないということです。最初にこれを言及するべきでした。
これは次の方法で簡単に軽減できます Base64 について読む. 。最新の Base64 で使用できる英数字以外の文字は、「/」、「+」、および「=」 (パディングにのみ使用されます) のみです。
このうち、URL のエスケープ表現として特別な意味を持つのは「+」だけです。他の 2 つは URL 内で特別な意味を持ちます (パス区切り文字とクエリ文字列区切り文字) が、問題を引き起こすことはありません。
だからあなたは大丈夫だと思います。
URL を制御できることを除けば、これとまったく同じ問題が発生しています。でもで Server.URLDecode
そして 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(" ", "+");
その後、正しく動作します。本当に奇妙だ。
Base64値を含むパラメータと「+」が付いている場合にも同様の問題が発生しました。Request.QueryString["VLTrap"].Replace(" ", "+"); のみ私にとってはうまくいきました。UrlEncode やその他のエンコードは役に立ちません。「%2b」としてエンコードされた「+」を使用してエンコードされたリンクをページ上に表示したとしても、それが表示されたときに最初にそれを「+」に変更し、クリックするとブラウザが変更するためです。それを空きスペースに置きます。したがって、元の投稿者が言うように、たとえ自分でリンクを表示したとしても、それを制御する方法はありません。HTMLメールでもそのようなリンクについては同じです。
URL に追加する前に文字列を URLEncode すれば、これらの問題は発生しません (自動 URLDecode によって元の状態に戻ります)。
もちろん、サーバーに送信する前に、Base64 文字列を URLEncode する必要があります。
それができない場合は、埋め込まれたスペースを単純に + に置き換えることをお勧めします。b64 文字列にはスペースが含まれていないことが想定されているため、これは正当な戦術です...
System.Web.HttpUtility.UrlEncode(yourString)
トリックを実行します。
簡単なハックとして、base64 デコードの前にスペースをプラス文字に置き換えることができます。
使用する場合 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
私は決して C# 開発者ではありませんが、Base64 文字列を URL として送信する前に URL ENCODE する必要があるようです。
スペースを + とみなして置き換えることはできませんか?
Request.QueryString["VLTrap"].Replace(" ", "+");
;)