PHPで安全なコンタクトフォームを作成|CSRF・XSS対策と基本コード解説


1. 導入:なぜ安全なコンタクトフォームが必要なのか?

  • フォームの脆弱性とは(XSS、CSRF、メールヘッダーインジェクションの簡単な説明)。
  • 「セキュリティ対策をしないフォーム」は攻撃対象になる可能性が高く、個人情報漏洩の原因になることを説明。

2. 完成イメージ:セキュリティ対策を加えたPHPフォームの概要

  • 入力項目:名前、メールアドレス、性別、国選択、メッセージ、チェックボックス(購読オプション)。
  • セキュリティ機能
    • XSS対策:入力データのサニタイズ。
    • CSRF対策:トークン検証。
    • メールヘッダーインジェクション防止。

3. コードの実装:PHPで安全なコンタクトフォーム

3.1 HTMLフォームの作成

以下の要素を含むフォームを紹介。

  • テキスト入力(名前、メールアドレス)
  • ラジオボタン(性別)
  • セレクトボックス(国)
  • テキストエリア(メッセージ)
  • チェックボックス(購読オプション)

code例

<form action="contact.php" method="POST">
    <!-- CSRFトークン -->
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

    <label for="name">名前:</label>
    <input type="text" id="name" name="name">

    <label for="email">メールアドレス:</label>
    <input type="email" id="email" name="email">

    <label>性別:</label>
    <input type="radio" name="gender" value="男性"> 男性
    <input type="radio" name="gender" value="女性"> 女性

    <label for="country">国:</label>
    <select name="country" id="country">
        <option value="日本">日本</option>
        <option value="アメリカ">アメリカ</option>
    </select>

    <label for="message">メッセージ:</label>
    <textarea id="message" name="message"></textarea>

    <input type="checkbox" id="subscribe" name="subscribe">
    <label for="subscribe">ニュースレターを購読する</label>

    <button type="submit">送信</button>
</form>

3.2 PHP側の処理

  • サニタイズ処理htmlspecialcharsstrip_tags
  • CSRFトークンの生成と検証
  • 入力データの検証
  • メール送信処理mail()関数)。

コード例

<?php
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die("CSRFトークンが無効です。");
    }
    function clean_input($data) {
        return htmlspecialchars(strip_tags(trim($data)), ENT_QUOTES, 'UTF-8');
    }
    $name = clean_input($_POST['name']);
    $email = clean_input($_POST['email']);
    $message = clean_input($_POST['message']);
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        die("無効なメールアドレスです。");
    }
    $headers = "From: " . str_replace(["\r", "\n"], '', $email);
    mail("your-email@example.com", "お問い合わせ", $message, $headers);
    echo "送信が完了しました。";
}
?>

4. セキュリティ対策のポイント解説

  • CSRF対策:トークンをセッションに保存し、リクエストごとに検証する方法。
  • XSS対策:入力値をhtmlspecialcharsでエスケープ。
  • メールヘッダーインジェクション防止:メールアドレスから改行コードを除去。
  • 入力バリデーション:必須項目の検証、メール形式の確認。

5. 補足:PHPMailerを使ったメール送信(高度な実装)

  • 外部ライブラリを利用した、安全で柔軟なメール送信の方法。

PHPMailer


6. まとめ

  • 安全なフォームを作成するためのポイントと、セキュリティ対策を忘れずに実装する重要性を強調。
  • サンプルコードを読者の学習や実装の参考として提供。

✪ 画像素材がないものはランダムで表示されるようになっています。フリー素材などでご用意ください。

おすすめChromeプラグイン一覧

プラグイン名特徴
GoFullPageウェブページ全体のスクリーンショットを簡単に取得できるブラウザ拡張機能です。
ColorZilla色を抽出するための拡張機能です。
WhatFontウェブページ上のフォントの情報を簡単に確認できるブラウザ拡張機能です。
PerfectPixelデザイナーが作成したデザインと実際にコーディングされたウェブページがどの程度一致しているかを確認・調整するためのブラウザ拡張機能です。

模写の手順

ステップ内容
ステップ 1構図を手書きか全画面スクショ(Go full page等)した後、ペイントツールで四角で囲い、大まかなclass,命名規則をあらかじめ決める。
ステップ 2HTMLの基本構造を作成する
ステップ 3CSSでレイアウトを模写する
ステップ 4 中級〜JavaScriptを追加して動きを再現する
ステップ 5最終調整を行い、検証ツールやPerfectPixel(chromeプラグイン)などで完成を確認する。