PHPフォームとDB実装の安全対策|XSS・CSRF・PDO

PHP実践(フォーム・DB)とは|このカテゴリで分かること

問い合わせフォームや会員機能のように、ユーザーの入力を受け取り、画面に表示し、データベースへ保存する処理を PHP で作るときの手順と安全対策をまとめたカテゴリです。$_POST の受け取りから始め、バリデーション、XSS 対策、CSRF 対策、セッション、PDO によるプリペアドステートメント、パスワード保存、ファイルアップロード、リダイレクト、外部 API 呼び出しまでを扱います。

「PHP フォーム」「PHP セキュリティ対策」で調べる人が知りたいのは、動くコードよりも、どこで何を防ぐのかという全体像です。ここでは脅威ごとの防御の位置を整理し、実装は個別記事へ案内します。文法そのものは PHP基礎 で扱っています。

読む順番(おすすめの順路)

  1. PHPのフォーム送信の受け取り|$_POSTの基本と注意点 … 入力を受け取る入口で、以降の処理がすべてこの値を前提にするため。
  2. PHPのフォームバリデーション|filter_varと自作関数 … 受け取った値を信用せずに検証する基本を知るため。
  3. PHPのXSS対策|htmlspecialcharsの正しい使い方 … 出力時のエスケープという最初の防御を押さえるため。
  4. PHPのCSRF対策|トークンの作り方と検証方法 … 正規の画面からの送信かを確かめる仕組みを知るため。
  5. PHPのリダイレクト|header('Location')と二重送信対策 … 送信後の遷移と二重送信を防ぐ流れを作るため。
  6. PHPのセッション管理|ログイン状態の保持と安全な設定 … 画面をまたぐ状態の保持と、その設定の安全性を知るため。
  7. PHPのPDOとプリペアドステートメント|SQLインジェクション対策 … DB へ安全に値を渡す方法で、保存処理の中核のため。
  8. PHPのpassword_hashの使い方|パスワードの安全な保存 … 認証機能で欠かせない、パスワードの保存方法を知るため。
  9. PHPのファイルアップロード|安全な保存方法と検証 … 検証項目が多く難しいため、基礎を固めてから取り組むため。
  10. PHPのcURLで外部APIを呼ぶ|タイムアウトとエラー処理 … 外部との通信で、タイムアウトとエラー処理を学ぶため。

押さえておきたいポイント(リサーチ)

PHP 公式マニュアルで確認できる事実を、脅威ごとに整理します。最新の内容は公式で確認してください。

脅威・場面 公式マニュアルで確認できる内容
SQLインジェクション プリペアドステートメントのパラメータはドライバが自動で引用符処理を行い、アプリケーションでプリペアドステートメントだけを使えばインジェクションは起きないと記載されている。ただし、信頼できない入力でクエリの他の部分を組み立てる場合は、その部分にリスクが残る。
XSS htmlspecialchars は &、”、’、<、> を変換する。PHP 8.1 以降は既定の flags に ENT_QUOTES が含まれる。
パスワード保存 password_hash は salt を自動生成し、PHP 8.0 以降は手動指定の salt が無視される。保存列は 255 バイト程度が推奨とされる。
ファイルアップロード $_FILES の type はブラウザが送る値で信用できない。finfo などで中身を確認し、ファイル名を自前で生成し、move_uploaded_file で保存する例が示されている。アップロード先は Web ツリー外や実行権限なしの場所が望ましい。

よくある疑問

Q. PHP のフォームで最低限やるべきセキュリティ対策は何ですか。
A. 入力検証、出力時のエスケープ、CSRF トークン、プリペアドステートメントの4つです。順に PHPのフォームバリデーション|filter_varと自作関数、PHPのXSS対策|htmlspecialcharsの正しい使い方、PHPのCSRF対策|トークンの作り方と検証方法、PHPのPDOとプリペアドステートメント|SQLインジェクション対策 で扱います。

Q. 送信後に再読み込みすると二重登録されるのはなぜですか。
A. POST の結果をそのまま表示しているためです。リダイレクトで防ぐ方法は PHPのリダイレクト|header('Location')と二重送信対策 を参照してください。

Q. パスワードはどう保存すればよいですか。
A. 平文や自作の暗号化ではなく、専用の関数でハッシュ化します。手順は PHPのpassword_hashの使い方|パスワードの安全な保存 にあります。

Q. ログイン状態はどう保つのですか。
A. セッションを使います。安全な設定を含め、PHPのセッション管理|ログイン状態の保持と安全な設定 で説明しています。

編集部の見解

フォームとDBの実装は、一つひとつの対策よりも「入力は信用しない、出力は必ずエスケープする、DB には値を直接埋め込まない」という三原則を崩さないことが重要だと考えます。対策を個別に暗記すると抜けが出るため、入口、保存、出口のどこで何を防いでいるかを図にして確認すると見落としが減ります。なお実運用のサービスでは、自作に固執せず、実績のあるフレームワークやライブラリの機能を使うほうが安全な場合も多いと考えます。学習の段階で仕組みを理解しておくことが、その判断の助けになります。

出典(一次情報)

NOT FOUND

投稿が見つかりませんでした。