この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 3440|答える: 1

[出典] .NETのすべてのバージョンでBase64のデコードエラーが存在します

[リンクをコピー]
掲載地 2023/07/31 18:36:01 | | | |
ある晴れた朝、私はノートパソコンの前に座ってC#コードを再構築していました。 すべて順調で、今日は生産的な一日になるでしょう。 それから、定数文字列の文字に等しい符号を多数追加してしまい、物事が爆発しました。 生産性は失われました。 日曜日の穏やかな再建は過去のものだ。 太陽さえも雲の陰に隠れることを選んだ。

30〜40分かけて自分が何を間違えているのか考えた後、自分ではなかったと気づきました。 マイクロソフトです。 どうやらBase64のデコード関数で古いバグに遭遇したようです。Convert.FromBase64Stringこのバグは2003年に.NET 1.1が導入されて以来、確かに存在しています。 ワウ! それは古いね。 そして再現はそれほど難しくありません。 よく出来ました:

技術的には、これは違法なBase64です。 法的には「abc=」です。 なお、filler 文字は1文字のみ=。 Base64エンコーディングは、1文字の2進入力6ビットごとに表現されます。 これは、Base64エンコードされた文字列の4文字ごとに3バイトを表すことを意味します。 エンコードされたデータが3バイトの倍数でない場合、Base64エンコーダはフィラー文字を追加してBase64を4文字の倍数にします。 これにより、正しく「abc=」が入力されたBase64文字列が生成されます。 もう一つ = を加えると無効になります。

Base64「abc=」は2バイトとしてデコードされます[105, 183]。 そうです。 最後にもう一文字のパディング文字を追加しても、エンコード値自体は大きく変わらないはずです。 文の最後にスペースをつけるようなものです。 確かに存在しますが、文の意味は変わりません。 しかし.NETはそうは考えていません。 「abc==」はバイト[109]としてデコードされます。 入力を長くしたのに、短くなったのは変でした。 また、状況も変わってしまった。 最初のバイトは105から109になります。 例外もなかった。 もう一つ = を加えると例外が出ます。 すごい!

コード:

アウトプット:

'abc=' -> [105, 183]
'abc==' -> [109]
こんなに長い間、誰も気づかなかったのは本当に驚きです。 あるいは見つかったけど直さなかったのかもしれません。 Base64はネットワーク上の情報交換において非常に重要です。 それはどこにでもある。 しかし、.NETは欠陥のあるBase64デコーダーを何年も廃止していません。

最初は信じられず、調べ始めました。 しばらくググってみましたが、あまり情報が見つかりませんでした。 その後、StackOverflowに投稿しましたが、あまりうまくいきませんでした。 何が起きているのか理解した後は、自分自身の質問にも答えなければなりませんでした。 しばらくGitHubで検索した後、2018年7月に.NET Coreで作られた修正を見つけました。 最新の.NET Coreバージョンはこの問題を正しく処理し、例外をスローします:

Unhandled Exception: System.FormatException:入力は有効なBase-64文字列ではありません。なぜなら、非base-64文字、2つ以上のパディング文字、またはその中の不正な文字が含まれているからです。 キャラクターを補完する。
   System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
   at System.Convert.FromBase64String(String s)
   ./base64/Program.cs:13行目のProgram.DecodeAndPrint(文字列base64)にて
   ./base64/Program.cs:8行目のProgram.Main()にて
問題を見つけて修理するのに約15年かかりました。 興味深いことに、誰も特に修正しようとはしていませんでした。 これは、速くするためにコードを書き直した際に起こりました:

Convert.FromBase64()には、文字列の最後に違法にパッドされた2番目の文字が、最後から2番目の文字を削除してデコードが「成功」するという微妙なバグがあります。

私たちは にいます。 このバグはNetCore 2.1でAPIが最適化された際に意図せず修正されました。 エラーを記録するためのテストを追加し、後退しないようにしましょう。
この問題は.NET Core 2.2で修正されました。 しかし、最新の.NET Framework 4.7.2バージョンでも問題は残っています。 モノでも壊れているように見えます。

.NET 4.7.2の回避策は、誤って入力された文字列を次のような方法でリフィルすることです。

翻訳元:ハイパーリンクのログインが見えます。





先の:Azure DevOps (viii) Pipelines Build ASP.NET MVCプロジェクトをコンパイルします
次に:.NET 6の新しいタイマーであるPeriodicTimerが使用されています
 地主| 掲載地 2023/07/31 18:39:50 |



Base64エンコード文字列構成(Base64に含まれる文字)
https://www.itsvse.com/thread-10629-1-1.html


免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com