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

認証と認可(ログイン機構+セッション制御)
ログイン認証の流れ
- フォームからユーザー名・パスワードを送信
- データベースから該当ユーザーを検索
- ハッシュ化されたパスワードと照合
- セッションにログイン情報を保存
サンプル:ログイン処理
<?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などのフレームワークを使用する際にもベースとなります。