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

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

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

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

Q&A

解決済

2回答

1396閲覧

PHP sessionがわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

2クリップ

投稿2021/04/02 17:35

前提・実現したいこと

セッションが理解できずにいます

問題点です
セッションIDがいくつも切り替わり、ファイルがたまっていく
1度のページロードで3個できたりと不思議な挙動をする

上記の問題点があり見直していたら、セッションファイルが生成されなくなってしまいました

お答えいただきたいです
①1度作ったセッションIDを切り替わることなく永久に使える形にしたいのですが、
どうしたらいいんでしょうか
②session_startはページ単位で記述するんでしょうか
③該当のコードだとなぜファイルが作られないんでしょうか

わからないことだらけです、教えて下さい

該当のソースコード

<?php header_remove('X-Powered-By'); ini_set("session.name","S"); ini_set("session.cookie_secure", 1); ini_set('session.gc_maxlifetime',31536000 ); ini_set('session.cookie_lifetime',31536000 ); ini_set('session.gc_probability',1); ini_set('session.gc_divisor', 100); session_start(); session_save_path($_SERVER['DOCUMENT_ROOT'].'/session/'); setcookie("S",session_id(),time()+365*24*3600,'/'); $_SESSION["id"]="aaa"; ?>

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

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

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

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

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

guest

回答2

0

ベストアンサー

httpsでのアクセスでなければ、ini_set("session.cookie_secure", 1); は外してください。これがあるとクッキーがブラウザから送信されなくなります(HTTPSであれば送信されます)。

session_regenerate_id(true); はログイン処理のあるページでだけ呼ぶとよいと思います。これがあると「毎回セッションIDが変更される」ことになります。ただし、そうなってもセッションの中身は維持されるはずですが。

ini_set("session.auto_start","1"); はini_setで変更できない項目なので単に無視されます。無駄なので削除をおすすめします。

session_save_path($_SERVER['DOCUMENT_ROOT'].'/session/'); はセキュリティ上極めて危険なので外してください。

あと、これは何ですか? セッションを使うのにsetcookieなんかしなくてよいですよ。余計なことをすればするほどトラブルや脆弱性の原因になります。

$old_sessionid = session_id(); setcookie("S",$old_sessionid,time()+365*24*3600,'/'); session_regenerate_id(); $new_sessionid = session_id(); setcookie("S",$new_sessionid,time()+365*24*3600,'/');

この処理だと、以下のタイミングで Set-Cookie: S=XXXXX... というレスポンスヘッダが出るはずです。元々クッキーSがセットされていない場合は、session_start()の段階でもSet-Cookieされるので、都合4回になる場合もあります。

$old_sessionid = session_id(); setcookie("S",$old_sessionid,time()+365*24*3600,'/'); // 1回目 session_regenerate_id(); // 2回目 $new_sessionid = session_id(); setcookie("S",$new_sessionid,time()+365*24*3600,'/'); // 3回目

③該当のコードだとなぜファイルが作られないんでしょうか

おそらく以下が原因です。

session_save_path($_SERVER['DOCUMENT_ROOT'].'/session/');

これだと、ドキュメントルート下の/session/ディレクトリにセッションファイルを生成しようとします(例 /var/www/html/session )。ここは通常PHPから書き込みの権限がないので、「ファイルが作られない」ことになります。この設定は外してください。前にも書いたように、仮にここにセッションファイルが作られると、セッションの内容を外部から参照できる状態になるので、セキュリティ上極めて危険です。

いろいろ余計なことをしすぎているので、いったん「これ以上単純にできない」ものからやり直したほうがよいと思います。

投稿2021/04/03 01:44

編集2021/04/03 01:48
ockeghem

総合スコア11705

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

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

退会済みユーザー

退会済みユーザー

2021/04/03 01:51

頭が色々混乱してしまいました 無駄が多い事を知り感謝いたします >session_save_path($_SERVER['DOCUMENT_ROOT'].'/session/'); はセキュリティ上極めて危険なので外してください。 外すとはどういうことですか?レンタルサーバーなのでセッションの保存場所をこれを書かないと指定できないんです
ockeghem

2021/04/03 02:02

レンタルサーバー側で設定されているはずですが…どのレンタルサーバーを使っていますか?
退会済みユーザー

退会済みユーザー

2021/04/03 02:20

初期設定は確かにされています 任意のところに設定したかったのでしました しない方がいいというところでしょうか すごくマイナーなレンタルサーバーです
退会済みユーザー

退会済みユーザー

2021/04/03 02:24

追記読みました >ここは通常PHPから書き込みの権限がないので、「ファイルが作られない」ことになります。 ファイルは作られて、それを参照していました 任意の場所に作るのはやめたほうがいいという事ですね 作られなかった原因は、session_start()の書く位置が悪かったようです session_start(); session_save_path($_SERVER['DOCUMENT_ROOT'].'/session/'); を session_save_path($_SERVER['DOCUMENT_ROOT'].'/session/'); session_start();に変えたら生成されていました
ockeghem

2021/04/03 02:25

「任意のところに設定したかったのでしました」ならやめてください。脆弱性になります。最悪ケースでは重要情報がだだ漏れになります。
ockeghem

2021/04/03 02:29

レンタルサーバーなら書き込めるでしょうね。通常レンタルサーバー等は安全を考慮して設定されているので、設定を変えること=脆弱性の原因になる可能性があります。よくわからないのであればなおさら元の設定のまま使うことをお勧めします。
退会済みユーザー

退会済みユーザー

2021/04/03 02:32

なぜ任意のところに設定したかったかといいますと、 作られたセッションファイルがどれくらいたまってるかや、中身が正常に記録されてるか確認したかったという観点からでした それは危ないことだったんですね
退会済みユーザー

退会済みユーザー

2021/04/03 02:37

あとクッキーにセッションIDを書き込んでるのは 書き込めば次回にそれが参照されるという情報を得たからです 密接な関係があるんじゃないんでしょうか? わけがわからなくなっています
退会済みユーザー

退会済みユーザー

2021/04/03 02:39

もしクッキーが不要であれば、どのようにしてブラウザはクライアントのセッションをずっと識別するのですか? そして、なぜクッキーにPHPSESSIDのように書き込む例題が多々あるんですか?
ockeghem

2021/04/03 02:39

クッキーはPHP側で自動的に書き込みするので、setcookie関数を呼び出す必要はありません。
退会済みユーザー

退会済みユーザー

2021/04/03 02:46

そうだったんですか 全く無知でした
ockeghem

2021/04/03 03:47

「なぜクッキーにPHPSESSIDのように書き込む例題が多々あるんですか?」への質問ですが、ぱっと思いつくのはセッションIDのクッキーを削除する場合です。この場合は明示的にsetcookie関数を呼び出す必要があります。削除でない例は思いつきませんが、URLを示してくれれば見てみます。
退会済みユーザー

退会済みユーザー

2021/04/03 12:30

こんにちわ シンプルに下記のようにしたのですが、 session_start(); $old_sessionid = session_id(); session_regenerate_id(true); $new_sessionid=session_id(); echo "古いセッション: $old_sessionid<br />"; echo "新しいセッション: $new_sessionid<br />"; $_SESSION["id"]=$_SERVER["REMOTE_ADDR"]; 古いセッションファイルが消えずに新しいのが生成されています session_regenerate_id(true); trueにすることで前のファイルは消され新しいものだけが残るという認識でしたが 間違いでしょうか? なぜ古いセッションファイルが残り続けるんでしょうか?
ockeghem

2021/04/03 13:22

それで古いセッションは消えるはずですが、どうやって、「古いセッションファイルが消え」ないことを確認しましたか?
退会済みユーザー

退会済みユーザー

2021/04/03 14:02

すみません、事象が再現できたりできなかったりとするため、一時保留とさせてください 貴重なお時間ありがとうございました ベストアンサーとさせていただきます
退会済みユーザー

退会済みユーザー

2021/04/03 20:55

> 「古いセッションファイルが消え」ないことを確認しましたか? これに回答できれば、ちゃんと解決できると思いますよ。 ockeghem さんは多分あたりを付けているので。 *再現できたりできなかったりするのも解決の大きなヒントになるはずです。 あと、レンタルサーバでコレ系の実験はやめた方が良いです。 人に迷惑をかける可能性もありますし、何より固有の設定が入っているケースが多いので、一般的な挙動と異なる動作をする場合があります。 ローカルにフルコントロール可能な実験環境を用意するのが良いです。
退会済みユーザー

退会済みユーザー

2021/04/03 23:21 編集

回答ありがとうございます 現時点ではセッションを自分で決めたパスにしておりました (うまく消えてるかどうかの確認しながらやりたかった為&ほかに確認できる手法を知らなかった為) 公開前にちゃんとセッションはレンタルサーバーもともとのパスにいれるようにします IDが切り変わってもともとのセッションが消えてないのは、解決しました sessionとクッキーの連携がうまくとれてなかったようで古いのが消えず作られ続けてるという事象が起きてたようです 無事に解決できました、ありがとうございました
guest

0

①1度作ったセッションIDを切り替わることなく永久に使える形にしたいのですが、

どうしたらいいんでしょうか

してはいけません。
セッションって基本は「ログイン情報や入力情報の”一時的、既定期間の”保持」に利用される個人情報に近しいものなので、セキュリティリスクのあるやり方を考えてはいけません。
なので、同じ人であってもログイン毎にsession_regenerate_idを呼んで新たにセッションIDを切り替えることが推奨されています。
該当するセキュリティ脅威としては「セッションハイジャック」でしょうか。

要件が良く分かりませんが、切り替わっても問題のでない仕組みを検討すべきです。

②session_startはページ単位で記述するんでしょうか

正確には「セッションを保持したいリクエスト単位」です。

③該当のコードだとなぜファイルが作られないんでしょうか

コード全体とアクセスの仕方、URL、具体的な操作を提示されないと何とも言えません。
実行時設定は確認しておいてください。

投稿2021/04/02 22:00

m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2021/04/03 00:40 編集

<?php header_remove('X-Powered-By'); ini_set("date.timezone", "Asia/Tokyo"); ini_set("session.name","S"); ini_set("session.cookie_secure", 1); ini_set('session.gc_maxlifetime',31536000 ); ini_set('session.cookie_lifetime',31536000 ); ini_set('session.gc_probability',1); ini_set('session.gc_divisor', 100); session_save_path($_SERVER['DOCUMENT_ROOT'].'/session/'); session_start(); $old_sessionid = session_id(); setcookie("S",$old_sessionid,time()+365*24*3600,'/'); session_regenerate_id(); $new_sessionid = session_id(); setcookie("S",$new_sessionid,time()+365*24*3600,'/'); echo "古いセッション: $old_sessionid<br />"; echo "新しいセッション: $new_sessionid<br />"; //session_destroy();//中身を空にするだけで古いセッションファイルは残り続ける $_SESSION["id"]="aaaa"; ?> このようにしたところ、一度のロードでセッションファイル3つが生成されます。 idの切替はできてるようなんですが、 切り替えた場合に古いセッションIDを残さない方法がわかりません
退会済みユーザー

退会済みユーザー

2021/04/03 00:53

できました これで合ってますか? <?php header_remove('X-Powered-By'); ini_set("date.timezone", "Asia/Tokyo"); ini_set("session.name","S"); ini_set("session.auto_start","1"); ini_set("session.cookie_secure", 1); ini_set('session.gc_maxlifetime',31536000 ); ini_set('session.cookie_lifetime',31536000 ); ini_set('session.gc_probability',1); ini_set('session.gc_divisor', 100); session_save_path($_SERVER['DOCUMENT_ROOT'].'/session/'); session_start(); $old_sessionid = session_id(); setcookie("S",$old_sessionid,time()+365*24*3600,'/'); session_regenerate_id(true); $new_sessionid = session_id(); setcookie("S",$new_sessionid,time()+365*24*3600,'/'); echo "古いセッション: $old_sessionid<br />"; echo "新しいセッション: $new_sessionid<br />"; $_SESSION["id"]="aaaa"; ?>
退会済みユーザー

退会済みユーザー

2021/04/03 00:54

上記記述に問題点がありましたらご指摘いただきたいです
退会済みユーザー

退会済みユーザー

2021/04/03 00:56

ページを開くたびにセッションIDが切り替わり、古いセッションファイルは削除され、新しいIDのセッションファイルとして 永続していく という形を想定しています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問