入力の検証(バリデーション)— 外から来た値を疑う

初級の解説は準備中のため、初級の内容を表示しています。

概要 — まず全体をつかむ

Webの守りの土台が、入力の検証。「外から来た値を、そのまま使わずに確かめる」ことです。

詳細 — 1段階ずつ追う

なぜ必要?

ブラウザから届く値・URLのパラメータ・アップロードされるファイル——これらは攻撃者が自由に作れるものです。そのまま使うと、XSSやSQLインジェクションなどの穴になります。だから、まず疑って確かめます。

どう確かめる?

  1. — 数値のはずが文字列でないか
  2. 範囲・長さ — 想定の範囲に収まっているか(年齢が -1 や 9999 でないか)
  3. 形式 — メールの形、日付の形など
  4. 許可リスト — 「許可するものだけ通す」(危ないものを列挙するより安全)

入力検証は、外から来た値を確かめる「関所」です。通ったものだけ処理へ進み、怪しいものは弾きます。

アニメーション『入力検証=関所』を開く
外から来た値(信用しない)フォーム利用者の入力URLパラメータAPI外部からの呼び出し⛩ 関所(検証)型が正しい?範囲内?許可リストにある?通ったものだけ処理へ安全な値だけを使う✕ 怪しいものは弾く(拒否)フロントのチェックは「親切」。サーバで必ず再検証する。外から来たものは信用しない。すべての守りの土台。

そして最重要は、サーバ側で必ずやること。フロントのチェックは利用者への親切であって、防御ではありません。

⚠️ 気をつける

  • フロントだけで検証 — 直接サーバへ送られたら素通り
  • 拒否リスト頼み — 危ないものを列挙する方式は抜けが出る
  • 検証と無害化の混同 — 検証(弾く)と、出力時のエスケープ(無害化)は別の対策。両方要る

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. 入力の検証を「サーバ側でも必ず」やるべき理由は?

2. 入力検証で安全側なのは?

3. 入力検証は「関所」に例えられます。関所の役目に近いのはどれ?

4. 「年齢が -1 や 9999 でないか」を確かめるのは、どの観点のチェック?

5. 「検証(弾く)」と「出力時のエスケープ(無害化)」の関係で正しいのはどれ?

6. 外から来た値を「まず疑う」のはなぜ?

7. 「許可するものだけを通し、それ以外は弾く」検証方式を、何リストと呼ぶ?

8. 入力の検証は、フロント(手元)ではなく必ずどこ側で行うべき?