1

この状況では同様の入力でこのようなエラーが生成されるため、理解できないコードが破損することがあります。

たとえば、私の ASP.NET プロジェクトでは、次のような GET の結果を Base64 で返しています。

if (currentCert == String.Empty) Response.Redirect("~/Registration.aspx?" +
 Convert.ToBase64String(Encoding.UTF8.GetBytes("error=noEcpSelected")));

そのため... 1つの状況( GetBytes() メソッドの最後の文字列引数のみが変更されています)...通常の結果が得られましたが、別の状況では、無効な文字列形式に関するax例外が発生しました(たとえば、生成された上位コードそれ ):

入力は有効な Base-64 文字列ではありません。非 Base 64 文字、3 つ以上の埋め込み文字、または埋め込み文字の間に非空白文字が含まれているためです。

その変数のデバッガーを調べたところ、次のような値が得られました。

"ZXJyb3I9bm9FY3BTZWxlY3RlZA=%3d"上のコードが返されたのです

よくわかりません。%3d はどのように追加されたのですか?

そして最も奇妙なことは、別の文字列の 1 つのコードが異なる動作をすることです。1 つの文字列では - OK、他の文字列では - 常に %3d または %7d を追加します...

なんで?

4

1 に答える 1

2

=標準のbase-64には、クエリ文字列で意味を持つ を含めることができるため、base-64を盲目的にクエリ文字列に追加することはできません。特に、base-64 は==- it is で終わりますZXJyb3I9bm9FY3BTZWxlY3RlZA==。したがって、クエリ文字列は非常に紛らわしいです-キーと値でキーZXJyb3I9bm9FY3BTZWxlY3RlZAと値のペアを指定しているようです=(別名%3d、URLエンコーディングルールの下で)。

少なくとも、base-64 を URL エンコードするか、クエリ文字列で意味を持つトークンを含まない base-64 アルファベットに置換する必要があります。私の好みは、明示的なキーと値のペア、つまり... + "?t=" + urlencode(base64encode(yourdata))(疑似コードで)使用することでもあります。

逆は明らかに のようなものですbase64decode(urldecode(querystring["t"]))

于 2013-05-07T12:13:57.083 に答える