サニタイズ
ユーザー入力から有害なコードや不正な文字を除去・無害化する処理。XSS や SQL インジェクション対策の基本。
サニタイズ (サニタイゼーション) とは、ユーザーからの入力データに含まれる有害なコードや不正な文字列を除去・無害化する処理です。Web アプリケーションのセキュリティにおいて最も基本的な防御手段の一つであり、入力値を信頼せず必ず検証・変換するという原則に基づいています。サニタイズを怠ると、攻撃者がフォームや URL パラメータを通じて悪意のあるコードを注入し、データの漏洩やシステムの乗っ取りにつながる危険があります。
代表的な攻撃手法である XSS (クロスサイトスクリプティング) では、悪意のある JavaScript コードがユーザー入力を通じて Web ページに埋め込まれます。たとえば掲示板の投稿欄に <script>alert('XSS')</script> と入力された場合、サニタイズ処理がなければそのスクリプトが他のユーザーのブラウザで実行されてしまいます。SQL インジェクションでは、データベースクエリに不正な SQL 文が挿入され、データの改ざんや漏洩が発生します。Web セキュリティ入門の書籍で体系的に学べます。
サニタイズの方法には複数のアプローチがあります。HTML エスケープは特殊文字を実体参照に変換する手法で、< を < に、> を > に置換します。ホワイトリスト方式は許可された文字やタグのみを通過させる方法で、リッチテキストエディタの出力を安全に表示する場合に有効です。ブラックリスト方式は禁止パターンを除去しますが、未知の攻撃パターンに対応できないため、ホワイトリスト方式の方が安全性は高いとされています。
実務では、サニタイズはバリデーション (入力値の妥当性検証) と組み合わせて使用します。バリデーションは「入力が期待する形式かどうか」を判定し、サニタイズは「入力を安全な形式に変換する」処理です。たとえばメールアドレスの入力欄では、バリデーションで形式を確認し、サニタイズで HTML タグを無害化するという二段構えの対策が推奨されます。フレームワークの多くはサニタイズ機能を標準で提供しており、自前で実装するよりもフレームワークの機能を活用する方が安全です。
サニタイズとエスケープは混同されがちですが、厳密には異なる概念です。サニタイズは危険な要素を除去または変換する包括的な処理を指し、エスケープは特定のコンテキスト (HTML、SQL、URL など) で特殊な意味を持つ文字を安全な表現に変換する処理です。出力先のコンテキストに応じて適切なエスケープ方式を選択することが重要で、HTML 出力には HTML エスケープ、SQL クエリにはパラメータ化クエリ (プリペアドステートメント) を使用します。
文字数カウントの観点では、サニタイズ処理により文字列の長さが変化する点に注意が必要です。たとえば < が < に変換されると、1 文字が 4 文字に増えます。データベースのカラム長やフォームの文字数制限を設計する際には、サニタイズ後の文字列長を考慮する必要があります。ユーザーが入力した文字数と、サニタイズ後にデータベースに保存される文字数が異なるケースは、バグの原因になりやすいポイントです。セキュアコーディングの書籍も参考になります。