PHPセキュリティ対策の実践

Webアプリケーションを構築する際に欠かせないのがセキュリティ対策です。
PHPでの開発では特に、ログイン認証セッション管理パスワードのハッシュ化CSRF・XSS・SQLインジェクションといった脅威への対応が重要になります。

本記事では、これらの対策をPHPで実装するための基本と実用コードを紹介します。


認証と認可(ログイン機構+セッション制御)

ログイン認証の流れ

  1. フォームからユーザー名・パスワードを送信
  2. データベースから該当ユーザーを検索
  3. ハッシュ化されたパスワードと照合
  4. セッションにログイン情報を保存

サンプル:ログイン処理

<?php 
 session_start(); 
 $pdo = new PDO("mysql:host=localhost;dbname=security_demo;charset=utf8", "root", ""); 
 if ($_SERVER["REQUEST_METHOD"] === "POST") { 
  $username = $_POST["username"]; 
  $password = $_POST["password"]; 
  $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); 
  $stmt->execute([$username]); 
  $user = $stmt->fetch(); 
  if ($user && password_verify($password, $user["password"])) { 
   $_SESSION["user_id"] = $user["id"]; 
   header("Location: dashboard.php"); 
   exit; 
  } else { 
   echo "ログインに失敗しました。"; 
  } 
} ?> 
<form method="post"> ユーザー名:<input name="username"><br> パスワード:
<input type="password" name="password"><br> <input type="submit" value="ログイン"> </form> 

セッションによる認可

<?php
 // dashboard.php session_start();
 if (!isset($_SESSION["user_id"])) {
  header("Location: login.php");
  exit; }
?>
<p>ログイン中のユーザーのみが見られるページです。</p>


CSRF/XSS/SQLインジェクションの防止

CSRF(クロスサイトリクエストフォージェリ)対策

CSRFを防ぐには、「トークン」をフォームに埋め込み、送信時に一致確認するのが基本です。

<?php 
 session_start(); 
 if (!isset($_SESSION["csrf_token"])) { 
  $_SESSION["csrf_token"] = bin2hex(random_bytes(32)); 
 } 
?> 
<form method="post"> 
 <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> 名前:
 <input name="name"><br> <input type="submit" value="送信"> 
</form> 
<?php 
 // POST処理時にチェック 
 if ($_SERVER["REQUEST_METHOD"] === "POST") { 
  if (!hash_equals($_SESSION["csrf_token"], $_POST["csrf_token"])) { 
   die("不正なリクエストです。"); 
  } 
 // 通常の処理を実行 
 } 
?> 

XSS(クロスサイトスクリプティング)対策

表示時にhtmlspecialchars()でサニタイズすることで防止できます。

<?php
 $comment = $_POST["comment"] ?? "";
 echo htmlspecialchars($comment, ENT_QUOTES, "UTF-8");
?>

SQLインジェクション対策

プリペアドステートメント(prepare + execute)を使い、SQLを安全に実行します。

<?php
 $stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
 $stmt->bindValue(":email", $email, PDO::PARAM_STR);
 $stmt->execute();
?>


パスワードハッシュ化(password_hash)

パスワードは必ず平文で保存しないこと。
PHPには強力なハッシュ化関数 password_hash() と検証用の password_verify() が用意されています。

登録時

<?php 
 $password = $_POST["password"]; 
 $hash = password_hash($password, PASSWORD_DEFAULT); 
 // ソルト自動生成+強力なアルゴリズム 
?>

ログイン時

<?php 
 // $hash はDBに保存されているハッシュ 
 if (password_verify($password, $hash)) { 
  echo "ログイン成功"; 
 } else { 
  echo "パスワード不一致"; 
 } 
?>

まとめ

本記事では、PHPによるセキュアなアプリケーション開発を網羅しました。

パスワード管理: password_hash()で安全に保存

認証: セッションでログイン状態を保持

認可: ユーザー制限をセッションで管理

CSRF対策: フォームにトークンを埋め込む

XSS対策: htmlspecialchars()で出力サニタイズ

SQL対策: プリペアドステートメントで安全なDB操作

これらのセキュリティ技術は、Laravelなどのフレームワークを使用する際にもベースとなります。

採用情報 長谷川 横バージョン
SHARE
PHP Code Snippets Powered By : XYZScripts.com