「入力チェック」とひとことで言っても、実務ではバリデーション・サニタイズ・エスケープという、役割の異なる3つの処理が登場します。
この3つは名前も似ていて、解説記事によって使われ方も微妙に違うため、混同されがちです。ここでは、それぞれが「何をする処理か」「いつ使うべきか」を、実際の入力値がどう変化していくかを見ながら整理します。
それぞれの詳しい対策方法は SQLインジェクションとは?仕組みと対策 と XSS(クロスサイトスクリプティング)対策の基本 で解説しています。全体像は Webアプリの脆弱性・セキュリティ対策まとめ をご覧ください。
| 処理 | 何をするか | いつ行うか | 代表的な対策 |
|---|---|---|---|
| バリデーション | 入力値が「形式として正しいか」をチェックする | 入力を受け取った直後 | 不正な形式の入力を拒否する |
| サニタイズ | 危険な要素(タグ・スクリプトなど)を取り除く、または無害な形に変換する | データを保存する前後 | リッチテキストの許可タグ制限など |
| エスケープ | 特殊文字を「意味を持たない表現」に変換する | データを画面やSQL文へ出力する直前 | XSS対策・SQLインジェクション対策 |
ポイントは、バリデーションは「入り口」、サニタイズは「保存前後の無害化」、エスケープは「出口」で行う処理だということです。それぞれ担当する場所が違うため、どれか1つをやれば済むというものではありません。
実際に入力しながら、1つの値が3つの処理をどう通過していくかを確認してみましょう。
1つの入力値が、3つの処理をどう通過していくかをその場で確認できます。
「不正な形式(記号のみ)」を試すと、①のバリデーションで止まり、後続の処理は実行されないままになったはずです。「HTMLタグ入り」を試すと、②のサニタイズでタグが取り除かれ、③のエスケープでさらに残りの記号が無害化されて画面表示イメージに反映されます。このように、入力値は段階を追って少しずつ安全な状態に変換されていきます。
入力バリデーションは、「メールアドレスの形式になっているか」「必須項目が空欄でないか」「文字数が範囲内か」といった、形式面のチェックです。
セキュリティ対策というより、まずはデータの品質を保つための処理という側面が強いですが、明らかに不正な形式の入力を早い段階で弾くことで、後続の処理に渡るデータの種類を絞り込める効果もあります。
注意したいのは、クライアント側(JavaScript)のバリデーションだけに頼らないことです。ブラウザの開発者ツールやAPIへの直接リクエストで、クライアント側のチェックは簡単に迂回できます。必ずサーバー側でも同じチェックを行う必要があります。
サニタイズは、入力値の中から危険な要素を取り除く、または安全な形に変換する処理です。
代表的なのは、リッチテキストエディタのように「一部のHTMLタグ(太字や改行など)だけは許可したい」場面です。この場合、単純にエスケープしてしまうとタグがすべて文字として表示され、意図した装飾が失われてしまいます。そこで、許可するタグだけを残し、<script>のような危険なタグを取り除く、というサニタイズ処理が必要になります。
実装には、自前でタグを正規表現などで取り除くのではなく、実績のあるサニタイズ用ライブラリを使うことを強く推奨します。HTMLの構文は例外パターンが非常に多く、自作の除去ロジックはすり抜けを生みやすいためです。
出力エスケープは、データを画面(HTML)やSQL文などへ出力する直前に行う処理です。
「タグを取り除く」のではなく、「タグとして解釈させない」のがエスケープの考え方です。<を<に変換するように、特殊文字の見た目を保ったまま、意味だけを無効化します。
単にテキストとして表示したいだけであれば、サニタイズは不要でエスケープだけで十分なケースがほとんどです。多くのテンプレートエンジンでは、この処理がデフォルトで自動的に行われます。
3つの処理は役割も実施タイミングも異なるため、どれか1つで済ませようとせず、それぞれの場所で正しく組み合わせることが、安全なWebアプリの基本になります。