「投票する」ボタンを押すと「処理1」が表示されるページを作りたいと思っています。
しかし、結果としては「不正なリクエストです」が表示されてしまいます。
set_member.php側で$_SESSION['csrf_token']の値を確認すると何も表示されないため、
遷移先で中身が消えていると推測されますが、原因が特定できません。
環境は以下で実施しています。
・サーバー:ロリポップ
・PHP:Ver7.4(php.iniの設定はロリポップデフォルト状態)
index.php
PHP
1<?php 2session_start(); 3$toke_byte = openssl_random_pseudo_bytes(16); 4$csrf_token = bin2hex($toke_byte); 5$_SESSION['csrf_token'] = $csrf_token; 6echo $_SESSION['csrf_token']; 7 echo '<div class="box_style box_style_pink">'; 8 echo ' <div class="box_inner">'; 9 echo ' <p><font size="4">テスト</font></p>'; 10 echo ' </div>'; 11 echo '</div>'; 12 echo '<form action="./set_member.php" method="POST">'; 13 echo ' <input type="hidden" name="csrf_token" value="'.$csrf_token.'">'; 14 echo ' <label><input type="radio" name="data" value="a"> a</label><br>'; 15 echo ' <label><input type="radio" name="data" value="b"> b</label><br>'; 16 17 echo ' <button input type="submit" class="btn btn-form01 dir-arw_r btn_style03"><span class="icon_arrow_s_right"></span> 投票する</button>'; 18 echo '</form>'; 19 20?> 21 22 23
set_member.php
PHP
1 2<?php 3session_start(); 4echo $_POST["csrf_token"]; 5echo $_SESSION['csrf_token']; 6 7 if ( $_POST['csrf_token'] === $_SESSION['csrf_token']) { 8 echo "処理1"; 9 } else { 10 echo "不正なリクエストです"; 11 } 12?>
参考サイトとは?URL提示してください。
あと「ほぼコピペ」はもはや別のものです。
完全コピペだとしても環境が全く同じでないと同じ挙動は保証されません。
自身のコードとしてきちんと見てください。
また、どういう操作して動作確認していますか?
赤の他人でも現象確認できるようにバージョンや操作手順も具体的に記載してください。
なんで === で比較してんの?
すみません。書いてあることは無視していただいて問題ありません。
貼ってあるコードを実行した場合、
「投票する」ボタンを押すと「処理1」が表示するページを作りたいと思っています。
PHPのVer7.4でサーバーはロリポップとなります。
php.iniの設定はロリポップデフォルト状態となります。
回答者には書いてあることが全てなので、誤りがあるのでしたら質問修正してご提示ください。
修正しました。
ちなみに最初のフォームの画面でブラウザからhtmlを確認すると想定の値は入ってますか?
空とnullは別物なのでvar_dumpでご確認ください
フォーム画面では想定の値が入っております。
※6行目:echo $_SESSION['csrf_token']; で値は確認できる。
遷移先でのecho $_SESSION['csrf_token']はNULLとなっていました。
hiddenのvalue値も確認しましたか?
解決しました。
session_startは先頭に書く、スペースを付けるななど記事調べてて把握していたのですが
「<?php」を先頭に書かないといけなかったのは気づきませんでした。
以下で処理1が表示されるようになりました。
set_member.php
------
<?php
session_start();
・・・
------
↓修正
------
<?php
session_start();
・・・
-------
>「<?php」を先頭に書かないといけなかった
正確には「出力の前に書く必要がある」ですね。
https://www.php.net/manual/ja/function.session-start.php
「注意」の項参照
そう言われると、修正前でも問題なく動くはずなのですが・・・なぜでしょう。
もともと、1行目は改行のみで2行目から書いていたものを1行目を削除しただけなので、
出力処理はないはずですが。
PHPタグ外はすべて出力対象です。
https://www.php.net/manual/ja/language.basic-syntax.phptags.php
理解しました。ありがとうございます!
ひとまず自己解決として解決までの経緯を投稿して締めてください
回答3件
あなたの回答
tips
プレビュー