コンテンツにスキップ

PHP/セキュリティ

出典: フリー教科書『ウィキブックス(Wikibooks)』
< PHP

セキュリティ

[編集]

入力値の検証とサニタイズ

[編集]

PHPではユーザーからの入力を必ず検証し、必要に応じてサニタイズする必要があります。

以下は、filter_inputを使用して入力値を検証する例です。

<?php
// GETパラメータ "email" を検証
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
    echo "無効なメールアドレスです。";
} else {
    echo "有効なメールアドレス: " . htmlspecialchars($email, ENT_QUOTES, 'UTF-8');
}
?>

CSRF対策

[編集]

CSRF対策としてトークンを利用する方法を示します。

<?php
session_start();

// トークン生成
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// フォーム表示
echo '<form method="POST">';
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
echo '<input type="submit" value="送信">';
echo '</form>';

// トークン検証
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
        echo "トークン検証成功";
    } else {
        echo "トークン検証失敗";
    }
}
?>

SQLインジェクション対策

[編集]

PDOを利用した安全なクエリ実行例です。

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');

// プリペアドステートメントで安全にデータを挿入
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute(['email' => $_GET['email']]);
$user = $stmt->fetch();
?>