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

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

ただいまの
回答率

90.76%

  • PHP

    19248questions

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

  • FuelPHP

    509questions

    FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

  • セキュリティー

    435questions

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

  • ログイン

    111questions

    ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

自動ログインの処理について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 5
  • VIEW 873

MG1986JP

score 410

会員サイトで一般ユーザーがアクセスできるすべてのページで自動ログインを実装しようと思っているのですが、自動ログインはしたことがなくて処理を洗い出してみたのですが、セキュリティー的な観点でだめなところやこうした方がいいなどありましたら教えていただけるとありがたいです。
※クッキーの有効期限やセキュアなどはシステム側で指定します。(fuelphpです)

クッキーがない場合            
    ログイン画面へ遷移させる        
    ログインする        
    ログインに使用したアドレスとパスワードがDBに存在するか確認する        
    存在する場合        
        ログインに使用したアドレスとパスワードを組み合わせてハッシュ化する    
        そのハッシュ値をクッキーに保存する    
        セッションを張って、トップページへ    
    存在しない場合        
        ログイン画面へ戻りそんな会員いねえよという    

クッキーがある場合            
    クッキーに保存されているハッシュ値と、DBに保管されているアドレスとパスワードを組み合わせたハッシュ値が存在するか確認する。        
    一致する場合        
        ハッシュ値からアドレスとパスワードを復元し、自動ログインする    
        セッションを張って、指定ページを表示    
    一致しない場合        
        アクセス端末の情報と位置情報と改竄回数を取得しDB保存    
        改竄回数が3回以内の場合    
            クッキーを改竄している可能性があるとみなし、警告画面を表示させる
        改竄回数が3回以上の場合    
            なにかしらの処理                                                                                            

修正後

■説明に必要なテーブル            
user            
    id        
    name        
    surname        
    mail        
    password        

user_token            
(パスワード変更時に新規token発行とパスワード記録)            
    id        
    user_id        
    pwssword        
    token        
    limit        

■おおまかな処理            
クッキーがない場合            
    ログイン画面へ遷移させる        
    ログインする        
    ログインに使用したアドレスとパスワードがDBに存在するか確認する        
    存在する場合        
        ログインユーザーが所持するパスワードのトークンを取得    
        そのトークンをクッキーに保存する    
        セッションを張って、トップページへ    
    存在しない場合        
        ログイン画面へ戻りそんな会員いねえよという    

クッキーがある場合            
    クッキーに保存されているトークンと、user_tokenにそのトークンが存在するか確認する。        
    存在する場合        
        user_tokenから遡りアドレスとパスワードを探し、自動ログインする    
        セッションを張って、指定ページを表示    
    存在しない場合        
        アクセス端末の情報と位置情報と改竄回数を取得しDB保存    
        改竄回数が3回以内の場合    
            クッキーを改竄している可能性があるとみなし、警告画面を表示させる
        改竄回数が3回以上の場合    
            なにかしらの処理
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+8

ここですが、

ハッシュ値からアドレスとパスワードを復元し、自動ログインする    

ハッシュ値から元の平文は復元できませんが、おそらくDBからアドレスとパスワードを求めるという意味だと解釈しました。これなら可能ですよね。
それは良いのですが、以下がよくありません。

ログインに使用したアドレスとパスワードを組み合わせてハッシュ化する   

この方法ですと、ハッシュ値は、パスワードを変更しない限り同じものになります。そうすると、ハッシュ値の有効期限を設定することができなくなりますし、ハッシュ値があればいつでもどこからでもログインできるので、そういうむやみに強力なものをクッキーに保存することは好ましくありません。
なので、ハッシュではなく、トークンを使います。トークンは、要は乱数ですね。提示いただいた処理は、概ねハッシュを使わなくてもトークンでも実装できます。考えてみて下さい。
トークンは、有効期限を設けることができます。有効期限はデータベースに保存しておきます。また、何らかの問題が発生した場合は、トークンの無効化も簡単にできます。


追記します。トークンですが、単純化した実例を書いてみます。

メールアドレス トークン 有効期限
tanaka@example.jp 5b9636a4 2017/12/31
sato@example.jp NULL NULL
takahashi@example.jp a4f84d89 2017/12/01
yamada@example.jp NULL NULL

ログインに成功したら、トークンをクッキーとして出力するとともに、DBには上記のように記録しておきます。これで分かりませんか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/09 18:46

    そちら見落としていました。
    確かにパスワードは生涯固定でなければならなくなってしまいますね。

    クッキーに保存される値は会員を識別できるものでなければならないのですが、乱数をクッキーに持たせてどうやって会員が存在するかを認識させるのでしょうか?

    test@test.compasswordでハッシュ化すればどうにかして会員の存在確認はできると思ったのですが、、、

    あ、会員のパスワードに対してトークンを持たせておいて、パスワードが変更されるたびにトークンも発行。

    クッキー側のトークンもパスワードに紐つくトークンと比較して、そのパスワードは誰のもの?を拾って行けば実現できるとういうことですね。

    キャンセル

  • 2017/12/09 23:04

    えーっと、自動ログイン時はパスワードは必要ありません。利用者がトークンを持っているだけでログイン状態にするのです。トークンの例を追記しましたので確認ください。

    キャンセル

  • 2017/12/10 00:34 編集

    まず、メールアドレスとパスワードでログインするという固定概念があります。
    fuelPHPのAuth認証の場合、アドレスとトークンがメインということでしょうか?

    パスワードを変更すると、、、という話が一番最初にあったと思いますが、編集いただいた回答の中でパスワードはどこにいきましたでしょうか?

    キャンセル

  • 2017/12/10 10:09

    『fuelPHPのAuth認証の場合、アドレスとトークンがメインということでしょうか?』<これは関係ありません。自動ログインの話をしているのですよね。自動ログインの実装方式はいくつかありますが、そのうちの一つがトークンによる方法です。トークンを持っている(クッキーに保存してある)ことをもって、正規ユーザーと認証するわけです。
    パスワードはいったん忘れましょう。パスワードをハッシュ値で保存する限り、正しいパスワードはサイト運営者にも分かりません。なので、パスワード以外の方法を使う必要があります。

    キャンセル

+2

提示の方法では実装できないのではないでしょうか。
試しに実装してみればわかることだと思いますが、

ハッシュ値からアドレスとパスワードを復元

ここが致命的な欠陥です。
ハッシュは不可逆です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/09 18:36

    実装している段階ではなく、仕組みをまとめている段階です。

    キャンセル

  • 2017/12/09 18:41

    設計の時に、実験コードは書いたりしないんですか?

    キャンセル

  • 2017/12/09 18:49

    書いたりしないですね。

    キャンセル

+2

そもそものログインの仕様が昨今のログインシステムで推奨されているやり方と違っています。

ログインに使用したアドレスとパスワードがDBに存在するか確認する 

昨今のログインシステムに生パスワードは使用しません。
ハッシュ値の比較になります。

また、やろうとしていることは、セッションの自作にあたると思います。
この辺は自作しないほうが良いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/09 18:35

    誤解がありましたが
    仕組み的なところを固めている段階ですので生では比較しないつもりです。

    自作しない方が良い理由があるのでしたら、そちらの回答をお願いします。

    キャンセル

  • 2017/12/09 18:55 編集

    セッション機構を自作をしないほうが良い一番の理由は、「安全なセッションID」の作成が困難であることがあげられます。かなり多岐にわたるセキュリティ知識がないと、考慮漏れを防ぐことが難しいです。

    が、よく読むと、セッションの値として、「アドレスとパスワードを組み合わせてハッシュ化」したものを保存しておこうとしているんですかね?
    であれば、セッション機構は、php のモノか、フレームワークのモノを利用するのだと思うので、指摘は的外れでした。

    ただ、その場合は、「アドレスとパスワードを組み合わせてハッシュ化」したモノである必要性は無いので、 ockeghem さんの回答の通り、なんらかの適当な token を使用するほうが扱いが楽だと思います。

    キャンセル

  • 2017/12/09 19:01

    アドレスとパスワードを組み合わせてハッシュ化、と、セッション、は別の話です。
    アドレスとパスワードを組み合わせてハッシュ化はクッキーの値としての想定でしたがトークン方式の切り替えを検討します。
    セッションはクッキーとは別でバリデーション通過後にphp標準機能の使用を想定しています。
    回答ありがとうございました。

    キャンセル

  • 2017/12/09 19:13

    fuelphp ですよね?
    セッション機構がフレームワークで用意されているので、そちらの仕様も確認したほうが良いかと。

    あと、Auth パッケージも用意されているようなので、安全性を確認するのであれば、そちらのフローをトレースするのがてっとり早い気がします。
    http://fuelphp.jp/docs/1.7/packages/auth/intro.html

    キャンセル

  • 2017/12/09 19:21

    ありがとうございます。
    Authやったことなく逆に時間かかりそうなので、その部分だけは仕組みだけ固めて自分でやろうとしてました。

    fuelのAuthはクッキーもセッションも同時に扱っちゃう感じなんですかね、、、

    キャンセル

  • 2017/12/09 19:28

    私自身は、fuelphp を使用したことはありません。

    が、フレームワーク内でセッションを利用する場合、フレームワークで用意されている以外のセッション機構を使用すると思わぬ不具合が発生する可能性があります。

    fuel の Auth がどのような仕組みになっているのか追ったことはないですが、普通に考えると、フレームワークのセッション機構と密接に関連しているはずなので、php session に寄せるか、フレームワークのセッション機構 + Auth か、決め打ちが必要になると思います。

    キャンセル

  • 2017/12/09 19:32

    ありがとうございます。
    こちらは別で検討いたします。

    キャンセル

+1

一応ご承知かもしれませんが

Cookieを用いて自動ログイン、RememberMeトークンを保持するやり方は、
そのトークンの保持期間が通常のセッションIDより相当長期間になるかと思います。
通信の盗聴による漏洩リスクがあるので、ログインページのみではなく
全てのページをHTTPSとするデフォルトHTTPSとするか、
SetCookieヘッダにsecureフラグを指定してCookieの送出抑制することが望ましいです。

また、ブラウザを別の人と共有している人を考慮して、
自動ログインをするかどうかという情報をチェックボックスなどで選択してもらい、
トークンのCookieでの送出をしないという手続きが必要です。
その設定についてもCookieを使って保存しておき、
いちいちチェックを外さなくてもいいようにしてあげると外し忘れミスが減ります。

Remember-Me というワードで検索すると色々出てくると思いますので、
そちらのソースを参考にされると良いと思います。

http://fuelphp.jp/docs/1.9/packages/auth/examples/auth.html
http://fuelphp.jp/docs/1.9/packages/auth/simpleauth/usage.html#/method_remember_me

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19248questions

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

  • FuelPHP

    509questions

    FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

  • セキュリティー

    435questions

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

  • ログイン

    111questions

    ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。