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側の処理
- サニタイズ処理:
htmlspecialchars
、strip_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. まとめ
- 安全なフォームを作成するためのポイントと、セキュリティ対策を忘れずに実装する重要性を強調。
- サンプルコードを読者の学習や実装の参考として提供。