実現したいこと
ワンタイムトークンを成功させたい
前提
管理者ユーザーシステムで、ユーザー登録する際にCSRF対策でワンタイムトークンの
チェックを試みています。
しかし、受け取り側でメッセージ「不正なリクエストです。処理を中断します..」
(失敗した際のメッセージ)が表示されます。
該当のソースコード
//送信元 <!doctype html> <html lang=ja> <head> <meta charset="utf-8"> <title>ユーザーメンテナンス(修正)</title> <meta name="description" content="ユーザーの修正画面"> <!--リセットcss--> <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css"> <!--css--> <link href="css/ad_style.css" rel="stylesheet"> <!--レスポンシブ対応--> <meta name="viwport" content="width=device-width, initial-scale=1"> <!--Googleフォント--> <link href="https://fonts.googleapis.com/css2?family=Sawarabi+Gothic&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Shippori+Mincho:wght@500&display=swap" rel="stylesheet"> </head> <body> <h1>ユーザーメンテナンス(修正)</h1> <?php session_start(); function generateToken() { $bytes = openssl_random_pseudo_bytes(16); return bin2hex($bytes); } $token = generateToken(); $SESSION['token'] = $token; var_dump($SESSION['token']); try{ require_once("db_connect.php"); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $stmt=$pdo->prepare('select * from user_table where id=?'); $stmt->execute([htmlspecialchars($_REQUEST['id'], ENT_QUOTES | ENT_HTML5, 'UTF-8')]); foreach($stmt->fetchAll() as $row) { echo '<form action="user_update_conf.php" method="post" class="usermente">'; echo '<input type="hidden" name="token" value="$token">'; echo '<input type="hidden" name="seq" value="', htmlspecialchars($row['id'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), '" id = "seq" readonly=readonly>'; echo '<div id = "last_name">'; echo '<label for="sei">姓</label>'; echo '<input type="text" name="sei" value="', htmlspecialchars($row['last_name'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), '" id = "sei">'; echo '</div>'; echo '<div>'; echo '<label for="mei">名</label>'; echo '<input type="text" name="mei" value="', htmlspecialchars($row['first_name'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), '" id = "mei">'; echo '</div>'; echo '<div>'; echo '<label for="sei_kana">姓(カナ)</label>'; echo '<input type="text" name="sei_kana" value="', htmlspecialchars($row['last_name_kana'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), '" id="sei_kana">'; echo '</div>'; echo '<div>'; echo '<label for="mei_kana">名(カナ)</label>'; echo '<input type="text" name="mei_kana" value="', htmlspecialchars($row['first_name_kana'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), '" id="mei_kana">'; echo '</div>'; echo '<div>'; echo '<label for="user">ユーザー</label>'; echo '<input type="text" name="user" value="', htmlspecialchars($row['user'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), '" id="user">'; echo '</div>'; echo '<div>'; echo '<label for="password">パスワード</label>'; echo '<input type="password" name="password" value="', htmlspecialchars($row['password'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), '" id="password">'; echo '</div>'; echo '<div>'; echo '<label for="password2">パスワード(確認用)</label>'; echo '<input type="password" name="password2" value="', htmlspecialchars($row['password'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), '" id="password2">'; echo '</div>'; } } catch(PDOException $e){echo "次がエラーの内容です。;" .$e->getMessage();} ?> <div class = "button_layout"> <a href="user_table.php" class="button_c">戻る</a> <input type="submit" class="button_b" name="button" id="button" value="確認"> </div> </form> <script> document.addEventListener('DOMContentLoaded', function() { document.getElementById('button').addEventListener('click', function(){ var error = document.getElementById('msg'); var sei = document.getElementById('sei'); var lastName = document.getElementById('last_name'); var seiValue = sei.value; console.log(error); console.log (seiValue); if(error === null&&seiValue === null || error === null&&seiValue === ""){ var msg = '入力必須項目です。'; var ptag = document.createElement('p'); ptag.id = 'msg'; var text = document.createTextNode(msg); ptag.appendChild(text); var lastName = document.getElementById('last_name'); lastName.appendChild(ptag); event.preventDefault(); } else if(error !== null&&seiValue === null || error !== null&&seiValue === ""){ lastName.removeChild(lastName.lastChild); var msg = '入力必須項目です。'; var ptag = document.createElement('p'); ptag.id = 'msg'; var text = document.createTextNode(msg); ptag.appendChild(text); var lastName = document.getElementById('last_name'); lastName.appendChild(ptag); event.preventDefault(); } },false) },false) </script> <noscript>JavaScriptが利用できません</noscript> </body> </html> //送信先 <?php session_start(); if (!isset($_SESSION['token']) || !isset($_POST['token']) || $_SESSION['token'] !== $_POST['token']) { die('不正なリクエストです。処理を中断します..'); } unset($_SESSION['token']); function escape($val) { return htmlspecialchars($val, ENT_QUOTES | ENT_HTML5, 'UTF-8'); } ?> <!doctype html> <html lang=ja> <head> <meta charset="utf-8"> <title>ユーザーメンテナンス(修正)</title> <meta name="description" content="ユーザーの修正確認画面"> <!--リセットcss--> <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css"> <!--css--> <link href="css/ad_style.css" rel="stylesheet"> <!--レスポンシブ対応--> <meta name="viwport" content="width=device-width, initial-scale=1"> <!--Googleフォント--> <link href="https://fonts.googleapis.com/css2?family=Sawarabi+Gothic&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Shippori+Mincho:wght@500&display=swap" rel="stylesheet"> </head> <body> <h1>ユーザーメンテナンス(確認)</h1> <h2>下記でよろしいですか?</h2> <form action="user-update-commit.php" method="post" class="usermente_conf"> <input type="hidden" name="seq" value="<?php echo htmlspecialchars(escape($_POST['seq']),ENT_QUOTES,'UTF-8')?>" id = "seq" readonly=readonly> <div> <label for = "sei">姓</label> <input type="text" name="sei" value="<?php echo htmlspecialchars(escape($_POST['sei']),ENT_QUOTES,'UTF-8') ?>" id = "sei" readonly=readonly> </div> <div class=mei> <label for = "mei">名</label> <input type="text" name="mei" value="<?php echo htmlspecialchars(escape($_POST['mei']),ENT_QUOTES,'UTF-8') ?>" id = "mei" readonly=readonly> </div> <div> <label for = "sei_kana">姓(カナ)</label> <input type="text" name="sei_kana" value="<?php echo htmlspecialchars(escape($_POST['sei_kana']),ENT_QUOTES,'UTF-8') ?>" id="sei_kana" readonly=readonly> </div> <div> <label for = "mei_kana">名(カナ)</label> <input type="text" name="mei_kana" value="<?php echo htmlspecialchars(escape($_POST['mei_kana']),ENT_QUOTES,"UTF-8"); ?>" id="mei_kana" readonly=readonly> </div> <label for = "user">ユーザー</label> <input type="text" name="user" value="<?php echo htmlspecialchars(escape($_POST['user']),ENT_QUOTES,"UTF-8"); ?>" id="user" readonly=readonly> </div> <div> <label for = "password">パスワード</label> <input type="password" name="password" value="<?php echo htmlspecialchars(escape($_POST['password']),ENT_QUOTES,"UTF-8"); ?>" id="password" readonly=readonly> </div> <div> <label for = "password">パスワード(確認用)</label> <input type="password" name="password2" value="<?php echo htmlspecialchars(escape($_POST['password2']),ENT_QUOTES,"UTF-8"); ?>" id="password2" readonly=readonly> </div> <div class = "button_layout"> <button type="button" class="button_c" onclick="history.back()">戻る</button> <input class="button_b" type="submit" value="確認"> </div> </form> </body> </html>
試したこと
送信元でvar_dumpしたところ、$SESSION['token']は問題なさそうです。
$SESSION[’token’]が送信先に渡せてない気がします。
送信元のソースの
echo '<input type="hidden" name="token" value="$token">';
の記述が悪いのかもしれませんが、何が悪いのかもわからずです。
補足情報(FW/ツールのバージョンなど)
質問とは関係ありませんが、送信元ソースのjavascriptは作りかけです。

回答1件
あなたの回答
tips
プレビュー