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

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

新規登録して質問してみよう
ただいま回答率
85.48%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Q&A

解決済

3回答

5193閲覧

セッションの暗号化について

退会済みユーザー

退会済みユーザー

総合スコア0

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

0グッド

3クリップ

投稿2016/07/10 02:58

編集2016/07/10 03:00

phpでユーザーidをセッションで登録してログインなどをおこなってるのですが、
($_SESSION['id']=単純な数字(1、2、3など))
このセッションを登録する際は
まず、単純な数字をランダムな文字列にして
md5などで暗号化した方が良いのでしょうか?

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

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

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

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

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

guest

回答3

0

まず、単純な数字をランダムな文字列にして

md5などで暗号化した方が良いのでしょうか?

md5が暗号化ではなくハッシュ化であることに関しては既に指摘がありますが

phpでユーザーidをセッションで登録してログインなどをおこなってるのですが、

($_SESSION['id']=単純な数字(1、2、3など))

要するに,今ログイン状態であるかどうかに加えて誰がログインしているかをセッションに保持したいということですよね.ハッシュ化してしまうと元のIDが復元できなくなるので,ハッシュ化してはいけません.

まず,$_COOKIE$_SESSIONの関係を理解しておく必要があります.

自分の主要な記事のまとめ - ユーザ認証およびプロトコル

ここのエントリで詳しく解説していますが,大まかにまとめると

  • $_COOKIE$_GET$_POSTの仲間で,Webブラウザから送られてくるもの

(これで送信されてくる情報はいくらでも改竄できる)

  • $_SESSIONはサーバ側に保存されるもので,Webブラウザ側から直接触れることはできない

(改竄できない)

  • **$_COOKIE['PHPSESSID']という特殊なCookieによってセッションの持ち主が識別され,

該当するユーザの$_SESSIONsession_start()の呼び出しでファイルから復元される**

ということになります.但し,運用上の注意点がいくつかあります.

1つ目は,ログイン成功直後に必ずsession_regenerate_id(true)を実行することです.これを行わないと,ログイン前のPHPSESSIDが何らかの理由で他者に知られていたとき,そのPHPSESSIDを使ったセッションでログインを行ってしまうと,他者に乗っ取りを許してしまうことになります.必ずこの攻撃が成功するわけではないですが,XSS脆弱性やphp.iniの設定次第で可能になってしまうケースがあります.

2つ目は,通信をすべてhttps://で暗号化することです.会員制サイトをhttp://で運営すること自体もってのほかです.特に,パスワードの送信には絶対に暗号化が必要です.すべてを暗号化するのが理想ですが,何らかの理由でパスワード送信以外のトラフィックが暗号化できない場合,定期的にセッションIDを変更するということも必要になります.これに関しても上記のエントリで詳しく解説しています.

3つ目は,データベースに格納するパスワードはハッシュ化することです.パスワードは最もプライベートな情報になりますが,他のサービスでも共通したパスワードを利用している人が多いので,サーバがクラックされるという最悪の自体が起こっても,絶対にバレないようにしなければなりません.
そのためには,password_hash()というmd5()よりもずっと強力なハッシュ関数を使い,ハッシュ化したものをデータベースに格納することです.検証にはpassword_verify()を使います.これに関しても上記のエントリで詳しく解説しています.

投稿2016/07/10 08:00

mpyw

総合スコア5223

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

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

mpyw

2016/07/10 08:47

2番目に関しては学習用途でローカル環境にてやっているぶんには構いませんが,1番と3番は学習用途でもキッチリ行ってください.
guest

0

セッションキーの作成としては概ねその通りです。ただ、ランダムの生成方法やMD5がどれぐらいの強度であるかを考慮する必要があり、知識が無いと安全かどうかの判断は難しいです。PHPに用意されている関数(後述)を用いた方が安全です。

セッションキーは予測不可能である必要があります。もし、セッションキーが予測可能であれば、セッションハイジャックという大変危険な攻撃が可能になる場合があります。セッションハイジャックが成功すると、悪意ある第三者がログインしたユーザーであるとサーバー側を騙すことになり、そのユーザーの情報を全て入手したり書き換えたりします。セッションハイジャックを防ぐために、予測不可能とはどういうことかというと、次のようなことです。

  1. ソースコードからセッションキーを推測できない。(オープンソースでは無くても、どこかで漏れて、攻撃者がソースコードを入手している可能性はあり得ます。ソースコードは見られていることを前提に対策すべきです)
  2. ユーザーの情報や時刻からセッションキーを推測できない。
  3. これまで生成されたセッションキーから推測できない。

これらを満たすのが**暗号論的疑似乱数生成機**で作成した疑似乱数です。1.と2.を満たすだけなら、通常の疑似乱数でも可能ですが、通常の疑似乱数は予測可能であるという性質を持っています。そのため、3.を満たすことができません。そこで予測不可能という性質を持たせたのが暗号論的に安全な疑似乱数という特殊な乱数です。

PHPには暗号論的疑似乱数を生成する関数openssl_random_pseudo_bytesが用意されています。余程の理由が無い限り、これを用いてください。内部処理としては通常の疑似乱数をMD5などの暗号学的ハッシュ関数で処理しているのですが、安全で強いものになるように考慮した設計になっています。自分で作るよりも非常に安全です。

または、session_startなどを使ってください。同じように安全な疑似乱数になるようになっています(古いバージョンは安全性が低いため、最新のPHPを使用してください)ので、自前でセッションの処理を行うよりは遥かに安全です。

ただの乱数やuniqidをそのままセッションキーに使用することはやめて下さい。そのような方法を用いている場合は、脆弱性があるアプリケーションと判断されます。

参考1: http://dsas.blog.klab.org/archives/52136166.html
参考2: http://ja.stackoverflow.com/questions/5411/

※ 例外として状態を持たない完全RESTfulなWebアプリケーションでのセッションキーは、そのWebサービス専用の鍵を設定ファイルや環境変数に持たせて、その鍵でセッションキーの生成や確認を行います。ただ、この方法はPHPでは一般的で無いと思われます。

投稿2016/07/10 04:01

raccy

総合スコア21735

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

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

mpyw

2016/07/10 07:33

セッションキーはsession_start関数の利用によって自動的に送受信される $_COOKIE['PHPSESSID'] のことですが,話題になっているのはそれを元に形成されるセッション変数 $_SESSION['id'] であるため,少し脱線しているように感じました.(有用な回答ではありますが)
raccy

2016/07/10 07:46

あ、よくみると$_SESSIONだ・・・session_startした後の話だったのですね。凄い勘違いしてました。はずかしー。
guest

0

ベストアンサー

このセッションを登録する際は

まず、単純な数字をランダムな文字列にして
md5などで暗号化した方が良いのでしょうか?

そのままの値をSESSIONにもたせて構いません。

ちなみに、md5() で生成される値は、暗号ではなく、ハッシュ値です。ですので、md5() は暗号化の関数ではありません。

投稿2016/07/10 03:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/07/10 03:09

そうなんですね ご回答ありがとうございました
退会済みユーザー

退会済みユーザー

2016/07/10 03:12

補足 適切に session_regenetated_id() を使ってSESSION_IDを固定化しないことは必須です。
退会済みユーザー

退会済みユーザー

2016/07/10 03:15 編集

わかりました。 もうひとつ聞きたいのですが Cookieで登録する場合も暗号化してなくてもよいですか?
退会済みユーザー

退会済みユーザー

2016/07/10 03:15

「暗号化じゃない」と指摘しましたよね。「暗号化」と「ハッシュ化」は異なる意味を持っています。用語は正しく使ってください。「ハッシュ化」は不可逆変換です。「ハッシュ化したもの」を取り出したい時にどうやってその値を利用します?
退会済みユーザー

退会済みユーザー

2016/07/10 03:43

あ、別にある暗号化のやり方でしなくてもいいですか?というこですね...言葉足らずですみません
退会済みユーザー

退会済みユーザー

2016/07/10 03:53

あなたの言っているmd5は暗号化じゃない。ハッシュ化です。あくまで今話題になっているのは「ハッシュ化」です。世の中の情報でmd5を「暗号化」と説明している間違いが多いので、md5=暗号化と認識してしまうのは無理がありませんが、今すぐ改めてください。 可逆暗号で暗号化するというのは、アプローチとして間違っているとは言えませんが、設計思想の問題です。必要であれば暗号化すればいいし、必要がないなら、冗長なだけです。
退会済みユーザー

退会済みユーザー

2016/07/10 04:00

わかりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問