phpでユーザーidをセッションで登録してログインなどをおこなってるのですが、
($_SESSION['id']=単純な数字(1、2、3など))
このセッションを登録する際は
まず、単純な数字をランダムな文字列にして
md5などで暗号化した方が良いのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
まず、単純な数字をランダムな文字列にして
md5などで暗号化した方が良いのでしょうか?
md5が暗号化ではなくハッシュ化であることに関しては既に指摘がありますが
phpでユーザーidをセッションで登録してログインなどをおこなってるのですが、
($_SESSION['id']=単純な数字(1、2、3など))
要するに,今ログイン状態であるかどうかに加えて誰がログインしているかをセッションに保持したいということですよね.ハッシュ化してしまうと元のIDが復元できなくなるので,ハッシュ化してはいけません.
まず,$_COOKIE
と$_SESSION
の関係を理解しておく必要があります.
ここのエントリで詳しく解説していますが,大まかにまとめると
$_COOKIE
は$_GET
や$_POST
の仲間で,Webブラウザから送られてくるもの
(これで送信されてくる情報はいくらでも改竄できる)
$_SESSION
はサーバ側に保存されるもので,Webブラウザ側から直接触れることはできない
(改竄できない)
- **
$_COOKIE['PHPSESSID']
という特殊なCookieによってセッションの持ち主が識別され,
該当するユーザの$_SESSION
がsession_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
総合スコア5223
0
セッションキーの作成としては概ねその通りです。ただ、ランダムの生成方法やMD5がどれぐらいの強度であるかを考慮する必要があり、知識が無いと安全かどうかの判断は難しいです。PHPに用意されている関数(後述)を用いた方が安全です。
セッションキーは予測不可能である必要があります。もし、セッションキーが予測可能であれば、セッションハイジャックという大変危険な攻撃が可能になる場合があります。セッションハイジャックが成功すると、悪意ある第三者がログインしたユーザーであるとサーバー側を騙すことになり、そのユーザーの情報を全て入手したり書き換えたりします。セッションハイジャックを防ぐために、予測不可能とはどういうことかというと、次のようなことです。
- ソースコードからセッションキーを推測できない。(オープンソースでは無くても、どこかで漏れて、攻撃者がソースコードを入手している可能性はあり得ます。ソースコードは見られていることを前提に対策すべきです)
- ユーザーの情報や時刻からセッションキーを推測できない。
- これまで生成されたセッションキーから推測できない。
これらを満たすのが**暗号論的疑似乱数生成機**で作成した疑似乱数です。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
総合スコア21735
0
ベストアンサー
このセッションを登録する際は
まず、単純な数字をランダムな文字列にして
md5などで暗号化した方が良いのでしょうか?
そのままの値をSESSIONにもたせて構いません。
ちなみに、md5() で生成される値は、暗号ではなく、ハッシュ値です。ですので、md5() は暗号化の関数ではありません。
投稿2016/07/10 03:08
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/07/10 03:09
退会済みユーザー
2016/07/10 03:12
退会済みユーザー
2016/07/10 03:15 編集
退会済みユーザー
2016/07/10 03:15
退会済みユーザー
2016/07/10 03:43
退会済みユーザー
2016/07/10 03:53
退会済みユーザー
2016/07/10 04:00
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/10 08:47