PHPの勉強で問い合わせフォームを作成しています。
こちらのCSRF対策のコードを書いて実行したら、文字化けしました。
// CSRF対策 if (!isset($_POST['token']) || $_POST['token'] !== getToken()) { exit('処理を正常に完了できませんでした'); }
それまでは正常に表示されていました。
原因は何でしょうか?
教えて下さい。
以下、長いですがコードです。
form.php
1<?php 2session_start(); 3 4if ($_SERVER['REQUEST_METHOD'] === "POST") { 5 6 // CSRF対策 7 if (!isset($_POST['token']) || $_POST['token'] !== getToken()) { 8 exit('処理を正常に完了できませんでした'); 9 } 10 11 // バリデーション 12 $inquiry = $_POST['inquiry']; 13 $name = $_POST['name']; 14 $email = $_POST['email']; 15 $error = array(); 16 17 if (empty($inquiry)) { 18 $error['inquiry'] = '必ずご記入下さい'; 19 } 20 21 if (empty($name)) { 22 $error['name'] = '必ずご記入下さい'; 23 } 24 25 if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 26 $error['email'] = 'メールアドレスの形式が正しくありません'; 27 } 28 29 // バリデーションエラーが無い場合お問い合わせを受付 30 if (empty($error)) { 31 32 header('Location: thanks.html'); 33 exit; 34 } 35} 36 37/** 38 * HTMLの特殊文字をエスケープして返す 39 */ 40function h($str) 41{ 42 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 43} 44 45/** 46 * CSRF対策用 トークンを取得 47 */ 48function getToken() 49{ 50 return hash('sha256', session_id()); 51} 52 53?> 54<!DOCTYPE html> 55<html lang="ja"> 56<head> 57 <meta charset="utf-8"> 58 <title>お問い合わせフォーム</title> 59</head> 60<body> 61 <h1>お問い合わせフォーム</h1> 62 <form action="" method="post"> 63 <input type="hidden" name="token" value="<?php echo getToken(); ?>"> 64 <p>お問い合わせ内容 ※必須</p> 65 <?php if (isset($error['inquiry'])) echo h($error['inquiry']); ?> 66 <p><textarea name="inquiry" rows="10" cols="100"><?php if (isset($inquiry)) echo h($inquiry); ?></textarea></p> 67 <p>お名前 ※必須</p> 68 <?php if (isset($error['name'])) echo h($error['name']); ?> 69 <p><input type="text" name="name" vale="<?php if (isset($name)) echo h($name); ?>"></p> 70 <p>ご連絡用Email ※必須</p> 71 <?php if (isset($error['email'])) echo h($error['email']); ?> 72 <p><input type="email" name="email" vale="<?php if (isset($email)) echo h($email); ?>"></p> 73 <p><input type="submit" value="送信"></p> 74 </form> 75</body> 76</html> 77
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/12 07:26