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

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

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

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

Q&A

2回答

3816閲覧

session_regenerate_id()を行うタイミングにつきまして

newyee

総合スコア213

PHP

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

1グッド

1クリップ

投稿2019/04/10 22:57

編集2019/04/10 23:06

session_regenerate_id()関数を行うタイミングについてお聞きしたいことがあります。
session_regenerate_id()関数は、セッションハイジャック対策としまして、セッションを再作成するための関数だと理解しているのですが、以下のコードではどこに配置するのが適切と思われますでしょうか?
以下のコードは簡易な交流サイトのログイン処理を行う為に作成しました「login.php」になります。

php

1 <?php 2 3session_start(); 4if(isset($_SESSION['id'])){ 5 6 header('Location:index.php'); 7 8}else if(isset($_POST['name']) && isset($_POST['password'])){ 9 $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8'; 10 $user = 'root'; 11 $password = '12345'; 12 $hash_password = password_hash($_POST['password'],$PASSWORD_DEFAULT); 13 14 try{ 15 $db = new PDO($dsn,$user,$password); 16 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 17 $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 18 $stmt = $db->prepare(" 19 SELECT id,name,password FROM users WHERE name=:name AND password=:pass 20 "); 21 $stmt->bindValue(':name',$_POST['name'],PDO::PARAM_STR); 22 $stmt->bindValue(':pass',$hash_password,PDO::PARAM_STR); 23 $stmt->execute(); 24 25 if($row = $stmt->fetch()){ 26 $_SESSION['id'] = $row['id']; 27 28 29 header('Location : index.php'); 30 exit(); 31 }else{ 32 header('Location:login.php'); 33 exit(); 34 } 35 }catch(PDOException $e){ 36 die('エラー:' . $e->getMessage()); 37 } 38 39}else{ 40 41?> 42<!DOCTYPE html> 43<html lang="en"> 44<head> 45 <meta charset="UTF-8"> 46 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 47</head> 48<body> 49 <h1>テニススクール交流サイト</h1> 50 <h2>ログイン</h2> 51 <form action="login.php"method="post"> 52 <p>ユーザ名:<input type="text"name="name"></p> 53 <p>パスワード:<input type="password"name="password"></p> 54 <p><input type="submit"value="ログイン"></p> 55 </form> 56</body> 57</html> 58 59 60<?php } ?> 61

上記コードは、データベースからユーザー情報をselectできた場合のみ、ユーザーidをセッションに格納しているのですが、疑問としまして、「$_SESSION['id'] = $row['id'];」ここでログイン(セッションidを格納)した直後に、session_regenerate_id()を設定したとしても、セッションハイジャックされるのが、session_regenerate_id()を行われた後でしたら、意味がないように思えます。「session_regenerate_id()」を作成した後だった場合は、セッションハイジャックできない理由などが、あったりするのでしょうか?

usamino👍を押しています

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

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

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

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

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

guest

回答2

0

正直、
実際に色んなところに入れて挙動(セッションファイル含めた)を確かめてから質問してね
って見た人は思うと思います。
何かしらアドバイスがついたとして「それが適切か」という判断はできるんでしょうか。
おそらく前にも言われたと思います。「回答者するくらいの人が言ってるから正しいんだ」
それって本当にそう言い切れますか?
ネットに転がっている情報を鵜呑みにしてはいけないのは分かりますよね。
それと同じです。結局のところ自身で検証・調査する必要が出てくるわけです。
手元に環境と目の前にコードがあるのだからまず試そう(teratailの指針ですね)

あなたがいずれ仕事で後輩や部下を持つようになったとして、どう説明しますか?
「理解する」ということは「人に説明できる」ということです。(確実な経験と根拠資料に基づいて)
そのあたり、自身のこれまでを振り返ってみてください。
すると今回の質問が「問題・課題がない」という非推奨の質問に限りなく近いことが分かるはずです。


そもそもセッションハイジャックにどんなセキュリティ脅威があるのかどんな攻撃手法があるのかを
理解する必要があります。

↓をひとまず読んでもらうとして

session_regenerate_id()はあくまでその対策手段の1つにすぎません。
上記記事でいえば「セッションハイジャックされないための対策」の「ワンタイムセッションIDの発行」のみの対応。
「これだけやっとけば完璧!」とは言えません。
「セッションハイジャック」ですからね。

記事より引用:

セッションIDをワンタイム化してしまい、攻撃されにくくする手段です。ワンタイム化するとアクセスするたびにセッションIDが変更されるので、特定は非常に難しいと言えます。
php環境下ならば「session_regenerate_id関数」を利用することで簡単に行えます。

「特定が難しい」だけです。

さてsession_regenerate_id()についてはマニュアルを読まれたら分かるかと思います。注意書きがありますね。
特に「警告」のところはきちんと読んでおいてください。
また、「実行したときにセッションファイルがどうなっているか」もきちんと追っておくこと。これを知っておく必要はあります。

引数をデフォルトのfalseのままにしておくとどうなるか想像してみてください。

あとは、下記のような記事を参考にすると自ずと見えてくるのではないでしょうか。

はからずも同じ方が書いた記事ですが、DB接続とか掲示板の件とかお手本になるコードもたくさん書かれています(たぶん以前も提示したはず)

投稿2019/04/11 00:16

編集2019/04/11 00:30
m.ts10806

総合スコア80850

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

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

m.ts10806

2019/04/11 00:37 編集

というか、セッションIDをDBとかセッションに格納する意味って全くないような。 ログインなら「ログイン状態か」「ユーザーID」だけでいい。 PHPマニュアルでセッション回りの機能や仕様、きちんと確認したほうがいいですね。
newyee

2019/04/11 01:46

ご回答ありがとうございます。 貼って頂きましたリンクを拝見させて頂いたのですが、自分はどこか勘違いをしてしまっていたような気がします。 今回提示させて頂いたコードですと、ユーザーIDをセッションIDに格納していますが、セッションIDが毎回同じな場合、ログインしている間にサーバーになんらかの攻撃をしかけられ、セッションIDが攻撃者に知られてしまう可能性があるため、session_regenerate_id()関数でログインするするたびに、セッションを再作成(セッションのワンタイム化)し、その危険性を減らす、といった使われ方もされるということでしょうか?
m.ts10806

2019/04/11 02:29 編集

>ここでログイン(セッションidを格納) と書いていたので「セッションIDを格納したのかな」と誰もが思います。 現在のセッションIDは普通に取得できるのに、なんでだろう、と。 https://www.php.net/manual/ja/function.session-id.php まあセッションIDは自動で振られるものもあるし、session_id()のPHPマニュアルにもあるように任意で設定もできるのでそのあたりは設計次第かなと。難読化させるために接頭辞をユーザーIDとかユーザー名とかタイムスタンプをつけてハッシュ化したものをつける例もあります。 「セッション 盗み方」とかで調べてみると良いです。 実際出てくるのは「確認方法」ですが、確認方法が分かれば結構自由にできるものです。 この回答にも別の質問の回答にも書きましたが、対応方法を理解するにはまず攻撃方法を理解することです。 気になったら質問するのも良いですが、まず提示された回答や記事を理解するところから始めてください。(提示した記事そのままで該当箇所引用したのに質問されていることに大変違和感があります。同じ事何回も書くのが好きな人はなかなかいないです)
newyee

2019/04/11 02:37 編集

んーなんといいますか、提示いただいたリンクとご回答を読んだ上で自分なりに解釈をし、ご返信させて頂いたといった感じでした
newyee

2019/04/11 02:38

>「セッション 盗み方」とかで調べてみると良いです アドバイスいただきあいがとうございます。 参考にさせて貰います。
m.ts10806

2019/04/11 02:39

>その危険性を減らす、といった使われ方”も” 「も」と言うからには他にどんな使い方を想定したうえでのコメントなのかを教えてください。
m.ts10806

2019/04/11 02:41

あまり同じことでゴタゴタ言いたくはないですが、ほとんど理解されていないように感じたから「まず提示された回答や記事を理解するところから始めてください。」と伝えています。自分なりの解釈ができるほど自信と経験があるのでしたら良いのですが、まず最初はそのまま受け取りましょう。 そして自身で検証して確認しましょう。文字だけでは何もわからないので実際にプログラム動かして挙動を見るしかありません。
newyee

2019/04/11 02:49

他の危険性に関しても、調べたらあるみたいだったのですが、、自分の中では返信させて頂いたものが一番納得もできため、そうではないかな?と思い、返信させてもらいました。 >提示された回答や記事を理解する 今回ですと、こちらのことを理解しようとしたのですが、全ては理解できなかった為、つまりこういうことかな?という確認の為の返信のつもりでした
m.ts10806

2019/04/11 02:54 編集

要約すると伝言ゲームみたいにどんどんずれていきます。 「使われ方”も”」と書いている時点でずれてます。 session_regenerate_id()はセッションIDの再発行。それ以上でも以下でもありません。それによってうける恩恵は「セッションIDの特定を難しくする」だけ。それ以上でも以下でもありません。 アクセス毎に変えるのが良いのかその他かが良いか、そもそも再発行しないかは設計・仕様です。システムを作る側がそのシステムの特性などを考慮して決めるものです。
newyee

2019/04/11 03:11

「セッションIDの特定を難しくする」ここの部分も何故特定が難しくなるのかが、理解しきれていない部分ではあるんですよね。最初にご返信させてもらったのも、セッションを再作成するのも、返信内容の理由などではないのかなと思ったからなんですよね
m.ts10806

2019/04/11 03:18

それはセッションIDをどうやって盗むか、盗むと何が(悪意をもった人観点で)おいしいか を知らないからです。調べてください。そして検証してください。 別の種類のブラウザが2つあれば自分でも検証できます。 「思った」のは何の根拠もありません。憶測です。 百聞は一見に如かずと言います。まとめ記事の文字情報だけで頭で考えても堂々巡りになるだけです。手を動かしてその目で確認してください。
m.ts10806

2019/04/11 03:23 編集

ただ1ついっておくと、session_regenerate_id()の採用有無を考えるのは全ての機能がきちんと揃ってからでも全く問題なく、コードとしては1行入れるだけなので切り離してできる枝葉、または蛇足と言って良い部分なので、今この段階でこれにこだわって他が疎かになるのほうが遥かにリスクが高いです。 徳丸本買われるのでしたら、そちら手に入れてきちんと読了してからで良いのでは。
newyee

2019/04/11 03:34

>session_regenerate_id()の採用有無を考えるのは全ての機能がきちんと揃ってからでも全く問題なく そうなんですね。まぁそれでしたら、今の段階では、こだわらず他の部分の学習を進めていっても良いかもしれませんね
m.ts10806

2019/04/11 03:37

「これがないと使用者がアプリケーション・システムを利用できない」かどうかで判断してください。
guest

0

session_regenerate_id()は直接的にセッションハイジャックを防ぐ物ではなく、
セッションフィクセイションによるセッションハイジャックを防ぐための物と考えています。

session_regenerate_id()を呼んだ後のセッションIDを盗める状況であれば、
何回セッションIDを変えたところで無駄ですので他の対策が必要です。

投稿2019/04/11 00:07

kopio

総合スコア487

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

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

newyee

2019/04/11 01:50

ご回答ありがとうございます。 >session_regenerate_id()を呼んだ後のセッションIDを盗める状況 まだ、勉強不足な部分もあり、どういった状況でセッションIDが盗めるかを把握しきれていない部分はあるんですよね... そこら辺の部分での混乱もあり、今回質問させて頂いたという感じです...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問