サニタイズとバリデーションとは?安全な入力検証方法

セキュリティ

セキュアな入力検証とは?

セキュアな入力検証とは、ユーザーが送信したデータを安全に処理するための技術です。ウェブアプリケーションはユーザーの入力を受け取りますが、不正なデータが混じるとシステムが攻撃される可能性があります。
そこで、「サニタイズ」と「バリデーション」を使って入力内容を確認・処理し、安全性を確保します。

なぜ入力検証が必要なの?

ユーザーが入力するデータは信頼できるとは限りません。
例えば:

  • SQLインジェクション:データベースを不正に操作される。
  • XSS攻撃:悪意のあるスクリプトを埋め込まれる。
  • 不正なデータの登録:予期しない形式や範囲外の値がシステムに入り込む。

これらを防ぐために、入力内容を「チェックしてOKなら受け付ける」「不正なものは取り除く」ことが必要です。

サニタイズとバリデーションの違い

項目サニタイズ(Sanitization)バリデーション(Validation)
目的不正なデータを無害化する入力が正しい形式・範囲かどうかをチェックする
処理内容不要な文字を除去、特殊文字をエスケープなどデータ形式や条件(数値、文字数、範囲など)の確認
<script>&lt;script&gt;に変換する入力が数字であることを確認する

サニタイズ(Sanitization)とは?

サニタイズは、「入力を無害化する」処理です。不正なコードや不要な文字を取り除いたり、エスケープして安全な形に変換します。

サニタイズの例

HTMLエスケープ

ユーザーがコメント欄に以下のようなコードを入力した場合

HTML
<script>alert('XSS攻撃!');</script>

サニタイズ処理をすると、以下のように変換されます

HTML
<script>alert('XSS攻撃!');</script> 

これにより、スクリプトがただの文字列として扱われ、実行されなくなります。

SQLエスケープ

データベースに不正なSQL文を送る攻撃(SQLインジェクション)を防ぎます。

  • ユーザーが入力:
    ' OR 1=1 --
  • サニタイズ後:
    \' OR 1=1 --

バリデーション(Validation)とは?

バリデーションは、「入力内容がルールに合っているか確認する」処理です。たとえば、「このフィールドは数値でなければならない」「文字数は10文字以内」などの条件をチェックします。

バリデーションの例

  1. メールアドレスの形式チェック ユーザーが入力したメールアドレスが正しい形式かどうかを確認します。
    • 正しい例:user@example.com
    • 誤った例:userexample.com
  2. 文字数制限 名前のフィールドが20文字以内であることを確認します。
  3. 範囲チェック 年齢フィールドが0~120の範囲内であることを確認します。

サニタイズとバリデーションを組み合わせる

セキュアな入力検証では、サニタイズとバリデーションを組み合わせて使います。

例:ユーザー登録フォーム

  • 入力フィールド:名前、メールアドレス、年齢
  1. バリデーション
    • 名前:必須入力、20文字以内。
    • メールアドレス:正しい形式か。
    • 年齢:0~120の範囲内か。
  2. サニタイズ
    • 名前: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の範囲内で入力してください。";
}

サニタイズとバリデーションのポイント

  1. 必ず両方行う
    • サニタイズで安全性を確保し、バリデーションで正確性を保証します。
  2. 全ての入力に適用
    • ユーザーが送信するすべてのデータに対して検証を行いましょう。
  3. フレームワークを活用
    • Laravel(PHP)やDjango(Python)などのフレームワークでは、サニタイズやバリデーションの機能が組み込まれています。

まとめ

サニタイズとバリデーションは、ウェブアプリケーションの安全性を守るために欠かせない手法です。

  • サニタイズ:不正なデータを無害化する。
  • バリデーション:データが正しい形式・条件を満たしているか確認する。

両方を適切に使うことで、ユーザーに安心して使ってもらえるアプリケーションを構築できます。「入力を信じない」を基本に、安全なシステムを目指しましょう!

コメント

タイトルとURLをコピーしました