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

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

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

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

Q&A

1回答

907閲覧

セッションデータが引き継ぐことが出来ない。解決策をお教えください。

chapp

総合スコア233

PHP

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

0グッド

0クリップ

投稿2020/10/26 16:09

お世話になります。
POST時、外部からのPOSTデータの受取りを避けるため、セッションとhiddenデータを組み合わせる仕組みを採用していますが、試行錯誤ながら上手くいったと思うものの、同じサーバー、違うドメインで利用したら上手くいかないという、不可解な状態となっています。

そもそも不適切なソースになっているのでしょうか?
ご教示いただけたら幸いです。

ログイン時のauthに利用。

Index.php

<?php Session_start(); If(!isset($_SESSION["member_no"]) OR !isset($_SESSION["member_id"])){ //ログインしていなかったらログインページを表示 require_once("./auth.php"); } //以下、続く。

以下は、上記ファイルにアクセスした際、ログインしていなかった場合に表示するログインページです。
セッションに与えた文字列をhiddenデータにも与え、POSTされたとき、セッションデータとhiddenデータを比較比較しようとするも、セッションに値が入っていない状況となってしまいます。

auth.php

<?php session_start(); //■POSTされたhiddenデータとセッションデータを比較しようとするも、セッションに値が入っていない if(isset($_SESSION["token"]) AND $_POST["token"] == $_SESSION["token"]){ if(isset($_POST["id"]) AND isset($_POST["password"])){ //SQL実行 POSTされたIDとパスワードが実在するものか検証 }else{ $Err = "E-Mailとパスワードを入力してログインして下さい。"; } } else{ $Err = "E-Mailとパスワードを入力してログインして下さい。"; } // トークン値発行 function random2($length = 32){ return substr(bin2hex(random_bytes($length)), 0, $length); } $_SESSION["token"] = random2(); // 未エラー、$_SESSION['mail'] が未登録の場合 if($Err != "" && $_SESSION["member_no"] == ""){ authform($Err); } function authform($Err){ //ログインをある一定回数失敗したら、$Invalidは「disabled」が代入され、ログインボタンを無効化している。 global $Invalid; ?> <!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <title>ログイン</title> </head> <body> <form method="post" name="form1"> <div class="row"> <div class="col-12 text-center"> <p><?php echo $Err; ?></p> </div> </div> <div class="row""> <div class="col-sm-3">E-MAIL</div> <div class="col-sm-9"> <input type="text" name="id" value="<?php echo $id; ?>" class="form-control float-left" placeholder="login@enone-tokyo.com" style="ime-mode:disabled; width:90%;"> </div> </div> <div class="row"> <div class="col-sm-3">PASSWORD</div> <div class="col-sm-9"> <input type="password" name="password" value="" class="form-control float-left" placeholder="" style="ime-mode:disabled; width:90%;"> </div> </div> <div class="row text-center"> <div class="col-sm-12"> <input type="hidden" name="token" value="<?php echo $_SESSION["token"]; ?>"> <p><button type="submit" class="btn btn-dark w-50" <?php echo $Invalid; ?>>Sign In</button></p> </div> </div> </form> </body> </html> <?php exit; } ?>

以上、この質問において不要と思われるソースは省いていますが、おかしなところありましたらアドバイス頂けないでしょうか?

お忙しいなか恐縮ですが、ご教示いただけましたら幸いです。
よろしくお願いいたします。

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

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

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

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

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

tanat

2020/10/27 01:04

>同じサーバー、違うドメインで利用したら上手くいかないという というのは、ドメインをまたいでセッションを維持させようとしている感じですか?
chapp

2020/10/27 06:44

tantさん ご親切な書き込みをありがとうございます。 私の質問が不十分だったようで申し訳ありません。 ドメインを跨ぐようなものではなく、同一ドメインです。 サーバーが同じなので諸々の環境も同じであろうと、そんな意味合いで書いたつもりでしたが、かえって誤解を与えてしまいました。申し訳ありません。
takasima20

2020/10/27 11:30

そういう時は、(逆に)「何を変えたか?」を考えるといいような気がします。 自分だったら、テスト中のソースが入ってるサーバーにつながってるないかを確認するかなあ。
chapp

2020/10/27 11:55

takasima20さん ご親切な投稿ありがとうございます。実はDBの接続先が違うだけで、HTML部も含め全く同じなので、何度か差し替えて動作確認をしたりしています。 なので、直接アクセスすると全く問題ないことや、関数内で使っていることなどの理由で、このSESSIONに代入する場所などに問題がある(不安定といういみ)のでは?と(自信なさ気ですが)そんなことまで考え調べているところなのです。
guest

回答1

0

質問から正確な状況が読み取れなかったので、よくやる切り分け方法を書いときます・

session id を cookie で持たせているのであれば、cookie が適切にサーバ/クライアント間でやり取りできているかを確認するのが、まず第一歩となります。
これは、クライアントのブラウザの開発ツールでリクエスト/レスポンスを確認すると良いです。

次に、$_SESSION にほんとに値があるかを確認します。
$_POST["token"] と比較する前に、$_SESSION の値を確認してみてください。

最後に、$_POST に値があるかを確認します。

*順番があるように書きましたが、怪しい順に書いてるだけで、どれからやっても良いですw

投稿2020/10/26 22:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chapp

2020/10/27 06:41

te2jiさん ご親切な回答をありがとうございます。 下手な説明で申し訳ありません。ちょっと分かりにくかったですね。 まず、アドバイスいただいた内容からお返事しますと、 1の開発ツールの件、こちらは使い方がいまいち理解出来ていませんが、このお返事の後、確認してみます。ありがとうございます。 そして2と3に関しては、POSTする前(セッションに入れた直後)と、hiddenデータがPOSTとして受け取れているかは確認済みです。 質問時にあるindex.phpにアクセスしたとき、ログイン前のユーザーであれば、requireにてログイン画面であるauth.phpを表示する仕組みとしていますが、requireしないで直でauth.phpにアクセスすると問題なく、index.phpからrequireを介すとPOST時、「代入していたセッションが消える」という状況まで確認しています。 同じソースで、同じサーバー内では、まだ稼働前だが正常にデータの受け渡しが出来ていること確認しているのですが、今回は何故かうまくいかず・・・。そもそも何か勘違いしてソースを書き誤っているのかと思い、質問した次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問