質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2262閲覧

遷移先で$_SESSIONの中身が消えてしまいます。なぜでしょうか。

_Soma

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/06/07 15:10

編集2021/06/08 02:33

「投票する」ボタンを押すと「処理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?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/06/07 20:22

参考サイトとは?URL提示してください。 あと「ほぼコピペ」はもはや別のものです。 完全コピペだとしても環境が全く同じでないと同じ挙動は保証されません。 自身のコードとしてきちんと見てください。 また、どういう操作して動作確認していますか? 赤の他人でも現象確認できるようにバージョンや操作手順も具体的に記載してください。
takasima20

2021/06/07 20:23

なんで === で比較してんの?
_Soma

2021/06/08 02:28

すみません。書いてあることは無視していただいて問題ありません。 貼ってあるコードを実行した場合、 「投票する」ボタンを押すと「処理1」が表示するページを作りたいと思っています。 PHPのVer7.4でサーバーはロリポップとなります。 php.iniの設定はロリポップデフォルト状態となります。
m.ts10806

2021/06/08 02:29

回答者には書いてあることが全てなので、誤りがあるのでしたら質問修正してご提示ください。
_Soma

2021/06/08 02:34

修正しました。
m.ts10806

2021/06/08 02:35

ちなみに最初のフォームの画面でブラウザからhtmlを確認すると想定の値は入ってますか?
m.ts10806

2021/06/08 02:36

空とnullは別物なのでvar_dumpでご確認ください
_Soma

2021/06/08 02:38

フォーム画面では想定の値が入っております。 ※6行目:echo $_SESSION['csrf_token']; で値は確認できる。 遷移先でのecho $_SESSION['csrf_token']はNULLとなっていました。
m.ts10806

2021/06/08 02:45

hiddenのvalue値も確認しましたか?
_Soma

2021/06/08 02:51

解決しました。 session_startは先頭に書く、スペースを付けるななど記事調べてて把握していたのですが 「<?php」を先頭に書かないといけなかったのは気づきませんでした。 以下で処理1が表示されるようになりました。 set_member.php ------ <?php session_start(); ・・・ ------ ↓修正 ------ <?php session_start(); ・・・ -------
_Soma

2021/06/08 03:01

そう言われると、修正前でも問題なく動くはずなのですが・・・なぜでしょう。 もともと、1行目は改行のみで2行目から書いていたものを1行目を削除しただけなので、 出力処理はないはずですが。
_Soma

2021/06/08 03:06

理解しました。ありがとうございます!
m.ts10806

2021/06/08 03:07

ひとまず自己解決として解決までの経緯を投稿して締めてください
guest

回答3

0

「session_start();」は出力前に記述必要があり、タグ外は出力対象とみなすそうです。
自分の環境では、「<?php session_start();」の記述を2行目から書いており、
「改行」の出力が事前に存在していたため、ページの遷移先で、$_SESSION['csrf_token']の中身がNULLとなっていた。

1行目から記載することで、遷移先でも意図した値を確認することができた。

投稿2021/06/08 03:16

_Soma

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

set_member.phpで以下デバッグしてください

PHP

1<?PHP 2session_start(); 3print_r($_SESSION); 4print_r($_COOKIE);

投稿2021/06/08 00:18

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_Soma

2021/06/08 00:48

↑間違えました。 set_member.php側に書くとこうなりました。 Array ( [csrf_token] => 82f2ebefa2fe88f45e4e0388e5c5bd7b ) Array ( [_im_vid] => 01F7EAMNEE83F5H67FYBQMC777 [cto_bundle] => aS0WaV9qeUJnSURFRE8lMkZlVCUyQjhaYzQzMm1HaFRQbXlhY09TRWklMkYzMUFCNzFOY2l5enQ0eTlGaXJqRzhKV0hIdVBJQk14TnRER2w1ckVwYjhybiUyQnh6RUdqMVF5dkVIb21scUdJdWNTNHR1NmdQQ045V2NJbWhCSGV0TGgxWVg2S2VGMU5pdGFWdHg2aGQlMkY1ZmolMkJSRyUyQlh0SUM0ZyUzRCUzRA [__gads] => ID=685f76aa082bb08c-22d9d81736c900d6:T=1622906954:RT=1622906954:S=ALNI_Mak3CbPX9wuTpD36mxrpRNshyE-Ug [_ga] => GA1.1.1794856836.1622908040 [_td] => b6db864a-165e-42b7-8149-bf1f8298a445 [_ga_HY4VW70JK2] => GS1.1.1623078990.10.1.1623079088.0 [PHPSESSID] => ktcras56ekppate8u5vn2d6ind )
yambejp

2021/06/08 00:53

普通にセッションは引き継がれているようです その流れなら$_POST['csrf_token'] === $_SESSION['csrf_token']の 条件式はtrueになるはずです
_Soma

2021/06/08 01:04

元のコードに先ほどのを追加しました。 FALSEになっているようです・・・。 a92b84e386cb3a9f02d3c3b99f67e9ddArray ( [_im_vid] => 01F7EAMNEE83F5H67FYBQMC777 [cto_bundle] => aS0WaV9qeUJnSURFRE8lMkZlVCUyQjhaYzQzMm1HaFRQbXlhY09TRWklMkYzMUFCNzFOY2l5enQ0eTlGaXJqRzhKV0hIdVBJQk14TnRER2w1ckVwYjhybiUyQnh6RUdqMVF5dkVIb21scUdJdWNTNHR1NmdQQ045V2NJbWhCSGV0TGgxWVg2S2VGMU5pdGFWdHg2aGQlMkY1ZmolMkJSRyUyQlh0SUM0ZyUzRCUzRA [__gads] => ID=685f76aa082bb08c-22d9d81736c900d6:T=1622906954:RT=1622906954:S=ALNI_Mak3CbPX9wuTpD36mxrpRNshyE-Ug [_ga] => GA1.1.1794856836.1622908040 [_td] => b6db864a-165e-42b7-8149-bf1f8298a445 [_ga_HY4VW70JK2] => GS1.1.1623078990.10.1.1623079088.0 [PHPSESSID] => ktcras56ekppate8u5vn2d6ind ) 不正なリクエストです
yambejp

2021/06/08 01:15

そうなるとset_member.phpをこうしてみるとか <?PHP session_start(); echo strlen($_POST["csrf_token"])."<br>"; echo strlen($_SESSION['csrf_token']);
_Soma

2021/06/08 01:21

やはり、$_SESSION['csrf_token']の中身は消えているようです・・・ 32 0不正なリクエストです
yambejp

2021/06/08 01:26

その前のテストで Array ( [csrf_token] => 82f2ebefa2fe88f45e4e0388e5c5bd7b ) だったんですよね?
_Soma

2021/06/08 01:40

あれ、、、コード間違えたのか今やっても出てきません。 すみません。 Array ( [_im_vid] => 01F7EAMNEE83F5H67FYBQMC777 [cto_bundle] => aS0WaV9qeUJnSURFRE8lMkZlVCUyQjhaYzQzMm1HaFRQbXlhY09TRWklMkYzMUFCNzFOY2l5enQ0eTlGaXJqRzhKV0hIdVBJQk14TnRER2w1ckVwYjhybiUyQnh6RUdqMVF5dkVIb21scUdJdWNTNHR1NmdQQ045V2NJbWhCSGV0TGgxWVg2S2VGMU5pdGFWdHg2aGQlMkY1ZmolMkJSRyUyQlh0SUM0ZyUzRCUzRA [__gads] => ID=685f76aa082bb08c-22d9d81736c900d6:T=1622906954:RT=1622906954:S=ALNI_Mak3CbPX9wuTpD36mxrpRNshyE-Ug [_ga] => GA1.1.1794856836.1622908040 [_td] => b6db864a-165e-42b7-8149-bf1f8298a445 [PHPSESSID] => ktcras56ekppate8u5vn2d6ind [_ga_HY4VW70JK2] => GS1.1.1623115392.11.0.1623115394.0 ) 不正なリクエストです
_Soma

2021/06/08 01:41

↑これ呼びました。 <?PHP session_start(); print_r($_SESSION); print_r($_COOKIE); if ( $_POST['csrf_token'] === $_SESSION['csrf_token']) { echo "処理1"; } else { echo "不正なリクエストです"; } ?>
_Soma

2021/06/08 02:54

デバッグコードのみで実行したとき、 「<?PHP」を1行目に記載していたので表示されたようでした。 実コードも1行目から記載したら意図通りの動きをしました。 お手数おかけして申し訳ありません。無事解決しました。 フォローありがとうございました。
yambejp

2021/06/08 02:56

> 「<?PHP」を1行目に記載していた その前になにか出力があったのですね? セッションはあらゆる出力より前に指定する必要がありますので ご留意ください
_Soma

2021/06/08 03:02

>その前になにか出力があったのですね? ないです・・・。 1行目は改行で2行目から記載してたので1行目を削除したら意図通りに動きました。 不思議です。
guest

0

まずはSessionが有効になっているか? 有効になっている場合はSessionデータを書き込むディレクトリのオーナーやパーミッションが正しいか? セッションの有効期限が正しく設定されているか? を確認してみてください。

参考)
https://egapool.hatenablog.com/entry/2016/12/16/001748

投稿2021/06/07 16:14

AbeTakashi

総合スコア4853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問