質問編集履歴

1 説明を修正しました

callmichael

callmichael score 73

2016/06/14 01:48  投稿

phpでのセッション認証について
前提
---
先日、以下の質問をさせていただきました。
[phpでの認証について](https://teratail.com/questions/37762)
その結果、phpでの認証に下記のページに書かれているセッション認証を使えば、
色々とうまくいくということが分かりました。
[PHPによる簡単なログイン認証いろいろ](http://qiita.com/mpyw/items/bb8305ba196f5105be15)
セッション認証について色々と調べましたが、腑に落ちない点や、
実装した際に不都合が生じる気がしています。
疑問に思ったこと
---
**1. セッションIDについて**
ログイン済みかどうかを下記のように判断していることが一般的なようです。
```php
!isset($_SESSION['username']
```
ここで、クライアント側で適当なセッションIDを用いて
usernameが保存されているセッションをCOOKIE?に故意に作成することができれば、
usernameの値さえ変えれば、好きなユーザーとしてログインした状態を作れるような気がしています。
そこで、セッションIDを生成したタイミングで、そのセッションIDをサーバー側で保持し、
毎回usernameとセッションIDを照合することで乗っ取りは防げるのではと思いました。
ただ、そこで2番目の疑問が生じました。
**2. 複数端末でのログインについて**
google, facebookなど、複数端末でログインできるようなサービスはたくさんあります。
上記のように、usernameとセッションIDを照合する仕組みで実装した場合、
ログインごとにセッションIDが変更されてしまうため、
端末Aでログイン後、端末BでログインをするとセッションIDが変更され、
端末Aはログアウト状態になってしまうと考えました。
そこで、usernameとpasswordによる認証が成功したタイミングで、
usernameとサーバー側で保持している文字列を使ってハッシュ値を生成すれば、
複数端末で同じハッシュ値が生成され、認証を行うことができるような気がしています。
ただ、これではハッシュ値が固定値となってしまうため、セキュリティ的に問題がある気もしています。
上記を踏まえて
---
以上のことから、現状ではusernameとサーバー側で保持している文字列からハッシュ値を生成し、
それを認証で使う方法が最も効果的なのではと考えています。
これに対して、問題があればご指摘をいただきたいです。
また、上記の記述の中に間違っている認識があれば教えていただきたいです。  
まだまだ勉強を始めたばかりで、説明部分で意味が通じていない箇所もあるかと思いますが、
ご意見いただけると幸いです。
よろしくお願いいたします。
  • PHP

    36751 questions

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

  • Android

    10067 questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • HTTP

    1088 questions

    HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る