RegExを使用してBase64データを検証またはサニタイズすることは可能ですか?それは簡単な質問ですが、この質問を駆り立てる要因はそれを困難にするものです。
私は、RFC仕様に従うために入力データに完全に依存することができないBase64デコーダーを持っています。したがって、私が直面している問題は、おそらくBase64データのように78に分割されない可能性がある問題です(78だと思います。RFCを再確認する必要があるので、正確な数値が間違っていても、私に指示しないでください)。行、または行がCRLFで終わっていない可能性があります。CRまたはLFのみの場合もあれば、どちらもない場合もあります。
そのため、このようにフォーマットされたBase64データを解析するのに時間を費やしました。これにより、次のような例では確実にデコードできなくなります。簡潔にするために、MIMEヘッダーの一部のみを表示します。
Content-Transfer-Encoding: base64
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu
わかりました、それで問題ない構文解析は、そしてまさに私たちが期待する結果です。また、99%の場合、コードを使用して、少なくともバッファー内の各文字が有効なbase64文字であることを確認すると、完全に機能します。しかし、次の例では、レンチを混ぜ合わせます。
Content-Transfer-Encoding: base64
http://www.stackoverflow.com
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu
これは、一部のウイルスやその他のメールリーダーでMIMEを解析しようとする一部のウイルスやその他のもので見られたBase64エンコーディングのバージョンです。もしそうなら。
私のBase64デコーダーは、2番目の例を次のデータストリームにデコードします。ここで、元のストリームはすべてASCIIデータであることに注意してください。
[0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D
2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8
誰もが両方の問題を一度に解決する良い方法を持っていますか?異なるルールが適用されたデータに対して2つの変換を実行し、結果を比較する以外に、それが可能かどうかさえわかりません。しかし、そのアプローチをとった場合、どの出力を信頼しますか?ASCIIヒューリスティックスが最善の解決策であるように見えますが、このコードが実際に関与しているウイルススキャナーのような複雑なものに、コード、実行時間、および複雑さがどれほど追加されるでしょうか。どのようにしてヒューリスティックエンジンをトレーニングして、許容可能なBase64とそうでないものを学習しますか?
更新:
この質問が引き続き取得するビューの数に応じて、C#アプリケーションで3年間使用してきた数十万トランザクションの単純なRegExを投稿することにしました。正直、ガンボの答えが一番好きなので、それを選んだのです。しかし、C#を使用していて、少なくとも文字列またはbyte []に有効なBase64データが含まれているかどうかを検出するための非常に迅速な方法を探している人にとって、私は次のことがうまく機能することがわかりました。
[^-A-Za-z0-9+/=]|=[^=]|={3,}$
そして、はい、これはBase64データのSTRINGのためのものであり、適切にフォーマットされたRFC1341メッセージではありません。したがって、このタイプのデータを処理する場合は、上記のRegExを使用する前にそのことを考慮してください。Base16、Base32、Radix、またはBase64を他の目的(URL、ファイル名、XMLエンコーディングなど)で扱う場合は、Gumboが彼の回答で述べたRFC4648を読むことを強くお勧めします。この質問/回答セットの提案を使用する前に、実装で使用される文字セットとターミネータを認識してください。
^
です。ただし、受け入れられた回答ほど複雑にならない、はるかに優れた正規表現は次のようになります^[-A-Za-z0-9+/]*={0,3}$