Base64 データを解析または検証するための正規表現 質問する

Base64 データを解析または検証するための正規表現 質問する

RegEx を使用して Base64 データを検証またはサニタイズすることは可能ですか? これは単純な質問ですが、この質問を促す要因がそれを困難にしています。

私は、入力データが RFC 仕様に完全に従うとは限らない Base64 デコーダーを持っています。そのため、私が直面する問題は、Base64 データが 78 文字 (78 だと思いますが、RFC を再確認する必要があるので、正確な数字が間違っていてもご指摘ください) の行に分割されない可能性がある、または行が ; で終わらない (つまり、 、、または のいずれかのみである可能性がある、あるいはそのどちらもない可能性がCRLFある) といった問題です。CRLF

そのため、このようにフォーマットされた Base64 データを解析するのに非常に時間がかかりました。このため、次のような例を確実にデコードすることは不可能になります。簡潔にするために、MIME ヘッダーの一部のみを表示します。

Content-Transfer-Encoding: base64

VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu

わかりました。解析は問題なく、まさに期待どおりの結果です。また、99% のケースでは、バッファー内の各文字が有効な base64 文字であることを少なくとも検証するコードを使用すると、完璧に機能します。ただし、次の例では問題が起こります。

Content-Transfer-Encoding: base64

http://www.stackoverflow.com
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu

これは、一部のウイルスや、厳密に規則、つまり RFC に従うメール リーダーではなく、どんな犠牲を払ってでも MIME を解析したいという一部のメール リーダーの要望を利用しようとするその他のもので見られる Base64 エンコーディングのバージョンです。

私の Base64 デコーダーは、2 番目の例を次のデータ ストリームにデコードします。ここで覚えておいていただきたいのは、元のストリームはすべて ASCII データだということです。

[0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D
2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8

両方の問題を一度に解決する良い方法を知っている人はいませんか?異なるルールを適用したデータに対して2つの変換を実行し、結果を比較する以外にそれが可能かどうかはわかりません。しかし、そのアプローチをとった場合、どちらの出力を信頼しますか?ASCIIヒューリスティックは、最高解決策はありますが、このコードが実際に関与しているウイルス スキャナーのような複雑なものに、どれだけのコード、実行時間、複雑さが追加されるでしょうか。ヒューリスティック エンジンをトレーニングして、許容される Base64 とそうでないものを学習させるにはどうすればよいでしょうか。


アップデート:

この質問が引き続き多くの閲覧数を獲得しているため、私は3年間C#アプリケーションで使用してきた単純な正規表現を投稿することにしました。このアプリケーションでは数十万のトランザクションが使用されています。正直なところ、私はガンボ最も良い方法なので、これを選択した回答として選びました。ただし、C# を使用していて、文字列またはbyte[]有効な Base64 データが含まれているかどうかを少なくとも検出する非常に簡単な方法を探している人にとっては、次の正規表現パターンが非常に役立ちます。

^[-A-Za-z0-9+/=]|=[^=]|={3,}$

あるいは、より単純化されたパターンとして、ケール:

^[-A-Za-z0-9+/]*={0,3}$

そして、これは単なるBase64データであり、適切にフォーマットされたものではないRFC1341メッセージ。したがって、このタイプのデータを扱う場合は、上記の正規表現を使用する前にそのことを考慮してください。他の目的(URL、ファイル名、XMLエンコーディングなど)でBase16、Base32、Radix、またはBase64を扱う場合は、非常に読むことをお勧めしますRFC4648それガンボこの質問/回答セットの提案を使用する前に、実装で使用される文字セットと終了文字を十分に理解しておく必要があるため、回答に記載されています。

ベストアンサー1

からRFC 4648:

データの基本エンコーディングは、おそらくレガシーな理由により US-ASCII データに制限されている環境でデータを保存または転送するために、多くの状況で使用されます。

したがって、データが危険であるとみなされるかどうかは、エンコードされたデータの使用目的によって異なります。

ただし、Base64 でエンコードされた単語に一致する正規表現を探しているだけの場合は、次のものを使用できます。

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

おすすめ記事