セキュアな入力検証とは?
セキュアな入力検証とは、ユーザーが送信したデータを安全に処理するための技術です。ウェブアプリケーションはユーザーの入力を受け取りますが、不正なデータが混じるとシステムが攻撃される可能性があります。
そこで、「サニタイズ」と「バリデーション」を使って入力内容を確認・処理し、安全性を確保します。
なぜ入力検証が必要なの?
ユーザーが入力するデータは信頼できるとは限りません。
例えば:
- 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)などのフレームワークでは、サニタイズやバリデーションの機能が組み込まれています。
まとめ
サニタイズとバリデーションは、ウェブアプリケーションの安全性を守るために欠かせない手法です。
- サニタイズ:不正なデータを無害化する。
- バリデーション:データが正しい形式・条件を満たしているか確認する。
両方を適切に使うことで、ユーザーに安心して使ってもらえるアプリケーションを構築できます。「入力を信じない」を基本に、安全なシステムを目指しましょう!
コメント