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

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

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

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

Q&A

解決済

1回答

7298閲覧

SSL接続にするとセッションが切れることの対処法

nakamura03

総合スコア25

PHP

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

0グッド

3クリップ

投稿2015/09/25 04:33

編集2015/09/25 04:51

phpを勉強し始めたばかりの者です。
SSL接続にするとセッションが切れることの対処法として、https専用セッションとhttpとの兼用セッションを用意すると良いとの記事を読みました。
それは、session_regenerate_idをしないセッションも用意するという理解でよろしいでしょうか??
現在は、このようになっていますが、
row[`password'] = データベースに格納しているパスワード
if (password_verify($_POST['password'], $row['password'])) {
// 4.認証成功なら、セッションIDを新規に発行する
session_regenerate_id(true);
$_SESSION["name"] = $_POST["name"];
$_SESSION["userid"] = $row['id'];
header("Location: toppage.php");
exit;
}

session_regenerate_id(true);の前に、
$_SESSION["name2"] = $_POST["name"];//兼用セッション
$_SESSION["userid2"] = $row['id'];//兼用セッション
を挿入することで対処できますか?
これだと、セッションハイジャック対策ができなくなってしまいそうなのですが…

よろしくお願いします。

追記:
この方法ではできませんでした。クッキーも使ってみましたが、httpページで維持できません。
どうしたら良いのでしょうか……

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

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

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

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

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

guest

回答1

0

ベストアンサー

PHPのセッションは、デフォルトでサーバー側のファイルに書き込んで、アクセスしてきた
ユーザーのブラウザにクッキーとして同じ値を送信します。
ユーザーがクッキーの値を送信しますので、サーバー側に書き込んだ値と同じかどうか確認しています。
このクッキーにセキュア属性がついていると、httpsでしか送信しなくなります。
httpsのURLだと問題ないですが、httpだと困りますよね。
そこで、セッションには、セキュア属性をつけないで、代わりにトークンを発行する方法があります。
トークンというのは特に名前に意味があるわけじゃないですが
何でもいいので、セッション変数にハッシュ値を入れておき、これをセキュア属性のクッキーとします。
そうすると、HTTPではセッションを利用できますし、HTTPSでも利用できることになります。
HTTPSでトークンが送られてくるのでトークンを確認すればいいんじゃないんでしょうか

トークンを発行するという方法がいいと思います。
参考記事
http://qiita.com/sksmnagisa/items/0f48541f795beabe886e

投稿2015/09/25 06:26

kabuhiki

総合スコア58

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

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

kabuhiki

2015/09/25 06:45

トークンを発行するという方法がいいと思います。 参考記事 トークンを発行するという方法がいいと思います。 トークンを発行するという方法がいいと思います。 トークンを発行するという方法がいいと思います。 ようす
kabuhiki

2015/09/25 06:48

要するに ハッシュ値を関数で生成する→MD5など ログイン時httpsにてセキュア属性のついたクッキーも発行する クッキーの値をセッションの変数に代入しておく。 httpsでのセッションはセキュア属性をつけない。よってHTTPでも利用できる。 ログインが必要なページやセキュア属性が必要なページではセッションIDの確認と セキュア属性のついたクッキーの値も確認しておく。 セッションIDが盗まれても、一緒に発行されたセキュア属性クッキーは盗めません。 セキュア属性クッキーが切れていたら再度ログインなど
nakamura03

2015/09/25 08:58

迅速で丁寧なご回答、本当にありがとうございます。 すいません、理解が及ばず…… そもそも、この場合はSESSIONではなくて、COOKIEで設定するということでしょうか?? まず、 //32バイトのCSRFトークンを作成 function get_csrf_token() { $TOKEN_LENGTH = 16;//16*2=32バイト $bytes = openssl_random_pseudo_bytes($TOKEN_LENGTH); return bin2hex($bytes); } $token = get_csrf_token(); そして、 $_SESSION['id'] = setcookie('id', $token, time()+3600, , , 1)// セキュア属性のついたクッキー httpのサイトでは$_SESSION['id']を使い、 httpsのサイトでは$_SESSION['id']と$_COOKIE['id']の値の確認。 と、言う理解でよろしいでしょうか……
kabuhiki

2015/09/25 09:21

そうです。セッションはセキュア属性のついていないタイプで実行します。 そしてそのときに普通にセキュア属性のついたクッキーをSESSION変数に代入します。 すると、ユーザーのクッキーにはセッションIDだけが書かれたものと、セキュア属性のときだけに送信するクッキーの2種類があることになり、サーバー側では、同じくセッションID、そしてセッション変数に代入したデータが入っています。 セッションにはセキュア属性をしていないので、危険ですが、重要なhttps領域での処理などでは、トークン(セキュア属性のクッキー)を利用して、合っているかどうか確認すれば、大丈夫ということです。
kabuhiki

2015/09/25 09:39

PHPのセッション関数を使うと、ユーザーに渡されるデータは、クッキーとしての セッションIDだけですよね。セッション変数に何を書き込もうとユーザーに渡されるのは セッションIDが書かれたクッキーファイルだけです。http領域でセッションハイジャックが危ないといいますが、結局httpとhttpsで使い分けても同じで、httpはセッションハイジャックの危険が消えません。それでも、IPアドレスなどをセッション変数に入れて確認すれば、強度はかなり高くなると思います。
nakamura03

2015/10/01 03:10

ご丁寧に何度もすいません! やっと理解できました。本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問