セキュアな入力検証とは?
セキュアな入力検証とは、ユーザーが送信したデータを安全に処理するための技術です。ウェブアプリケーションはユーザーの入力を受け取りますが、不正なデータが混じるとシステムが攻撃される可能性があります。
そこで、「サニタイズ」と「バリデーション」を使って入力内容を確認・処理し、安全性を確保します。
なぜ入力検証が必要なの?
ユーザーが入力するデータは信頼できるとは限りません。
例えば:
- SQLインジェクション:データベースを不正に操作される。
 - XSS攻撃:悪意のあるスクリプトを埋め込まれる。
 - 不正なデータの登録:予期しない形式や範囲外の値がシステムに入り込む。
 
これらを防ぐために、入力内容を「チェックしてOKなら受け付ける」「不正なものは取り除く」ことが必要です。
サニタイズとバリデーションの違い
| 項目 | サニタイズ(Sanitization) | バリデーション(Validation) | 
|---|---|---|
| 目的 | 不正なデータを無害化する | 入力が正しい形式・範囲かどうかをチェックする | 
| 処理内容 | 不要な文字を除去、特殊文字をエスケープなど | データ形式や条件(数値、文字数、範囲など)の確認 | 
| 例 | <script>を<script>に変換する | 入力が数字であることを確認する | 
サニタイズ(Sanitization)とは?
サニタイズは、「入力を無害化する」処理です。不正なコードや不要な文字を取り除いたり、エスケープして安全な形に変換します。
サニタイズの例
HTMLエスケープ
ユーザーがコメント欄に以下のようなコードを入力した場合
HTML
<script>alert('XSS攻撃!');</script>サニタイズ処理をすると、以下のように変換されます
HTML
<script>alert('XSS攻撃!');</script> これにより、スクリプトがただの文字列として扱われ、実行されなくなります。
SQLエスケープ
データベースに不正なSQL文を送る攻撃(SQLインジェクション)を防ぎます。
- ユーザーが入力:
' OR 1=1 -- - サニタイズ後:
\' OR 1=1 -- 
バリデーション(Validation)とは?
バリデーションは、「入力内容がルールに合っているか確認する」処理です。たとえば、「このフィールドは数値でなければならない」「文字数は10文字以内」などの条件をチェックします。
バリデーションの例
- メールアドレスの形式チェック ユーザーが入力したメールアドレスが正しい形式かどうかを確認します。
- 正しい例:
user@example.com - 誤った例:
userexample.com 
 - 正しい例:
 - 文字数制限 名前のフィールドが20文字以内であることを確認します。
 - 範囲チェック 年齢フィールドが0~120の範囲内であることを確認します。
 
サニタイズとバリデーションを組み合わせる
セキュアな入力検証では、サニタイズとバリデーションを組み合わせて使います。
例:ユーザー登録フォーム
- 入力フィールド:名前、メールアドレス、年齢
 
- バリデーション
- 名前:必須入力、20文字以内。
 - メールアドレス:正しい形式か。
 - 年齢:0~120の範囲内か。
 
 - サニタイズ
- 名前:HTMLエスケープ。
 - メールアドレス:不要な空白を削除。
 - 年齢:数値以外の文字を取り除く。
 
 
実際のコード例
PHPでのサニタイズとバリデーション
PHP
// サニタイズ
$name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
$age = filter_var($_POST['age'], FILTER_SANITIZE_NUMBER_INT);
// バリデーション
if (strlen($name) > 20) {
    echo "名前は20文字以内で入力してください。";
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "正しいメールアドレスを入力してください。";
}
if ($age < 0 || $age > 120) {
    echo "年齢は0~120の範囲内で入力してください。";
}
サニタイズとバリデーションのポイント
- 必ず両方行う
- サニタイズで安全性を確保し、バリデーションで正確性を保証します。
 
 - 全ての入力に適用
- ユーザーが送信するすべてのデータに対して検証を行いましょう。
 
 - フレームワークを活用
- Laravel(PHP)やDjango(Python)などのフレームワークでは、サニタイズやバリデーションの機能が組み込まれています。
 
 
まとめ
サニタイズとバリデーションは、ウェブアプリケーションの安全性を守るために欠かせない手法です。
- サニタイズ:不正なデータを無害化する。
 - バリデーション:データが正しい形式・条件を満たしているか確認する。
 
両方を適切に使うことで、ユーザーに安心して使ってもらえるアプリケーションを構築できます。「入力を信じない」を基本に、安全なシステムを目指しましょう!
  
  
  
  

コメント