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

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

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

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

PHP

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

ログイン

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

FuelPHP

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

Q&A

解決済

4回答

6538閲覧

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

earnest_gay

総合スコア615

セキュリティー

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

PHP

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

ログイン

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

FuelPHP

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

0グッド

6クリップ

投稿2017/12/09 09:06

編集2017/12/09 10:33

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

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

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

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

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

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

guest

回答4

0

ベストアンサー

ここですが、

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

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

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

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


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

メールアドレストークン有効期限
tanaka@example.jp5b9636a42017/12/31
sato@example.jpNULLNULL
takahashi@example.jpa4f84d892017/12/01
yamada@example.jpNULLNULL

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

投稿2017/12/09 09:35

編集2017/12/09 14:03
ockeghem

総合スコア11701

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

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

earnest_gay

2017/12/09 09:46

そちら見落としていました。 確かにパスワードは生涯固定でなければならなくなってしまいますね。 クッキーに保存される値は会員を識別できるものでなければならないのですが、乱数をクッキーに持たせてどうやって会員が存在するかを認識させるのでしょうか? test@test.compasswordでハッシュ化すればどうにかして会員の存在確認はできると思ったのですが、、、 あ、会員のパスワードに対してトークンを持たせておいて、パスワードが変更されるたびにトークンも発行。 クッキー側のトークンもパスワードに紐つくトークンと比較して、そのパスワードは誰のもの?を拾って行けば実現できるとういうことですね。
ockeghem

2017/12/09 14:04

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

2017/12/09 15:37 編集

まず、メールアドレスとパスワードでログインするという固定概念があります。 fuelPHPのAuth認証の場合、アドレスとトークンがメインということでしょうか? パスワードを変更すると、、、という話が一番最初にあったと思いますが、編集いただいた回答の中でパスワードはどこにいきましたでしょうか?
ockeghem

2017/12/10 01:09

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

0

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

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

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

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

投稿2017/12/09 09:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2017/12/09 09:35

誤解がありましたが 仕組み的なところを固めている段階ですので生では比較しないつもりです。 自作しない方が良い理由があるのでしたら、そちらの回答をお願いします。
退会済みユーザー

退会済みユーザー

2017/12/09 09:56 編集

セッション機構を自作をしないほうが良い一番の理由は、「安全なセッションID」の作成が困難であることがあげられます。かなり多岐にわたるセキュリティ知識がないと、考慮漏れを防ぐことが難しいです。 が、よく読むと、セッションの値として、「アドレスとパスワードを組み合わせてハッシュ化」したものを保存しておこうとしているんですかね? であれば、セッション機構は、php のモノか、フレームワークのモノを利用するのだと思うので、指摘は的外れでした。 ただ、その場合は、「アドレスとパスワードを組み合わせてハッシュ化」したモノである必要性は無いので、 ockeghem さんの回答の通り、なんらかの適当な token を使用するほうが扱いが楽だと思います。
earnest_gay

2017/12/09 10:01

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

退会済みユーザー

2017/12/09 10:13

fuelphp ですよね? セッション機構がフレームワークで用意されているので、そちらの仕様も確認したほうが良いかと。 あと、Auth パッケージも用意されているようなので、安全性を確認するのであれば、そちらのフローをトレースするのがてっとり早い気がします。 http://fuelphp.jp/docs/1.7/packages/auth/intro.html
earnest_gay

2017/12/09 10:21

ありがとうございます。 Authやったことなく逆に時間かかりそうなので、その部分だけは仕組みだけ固めて自分でやろうとしてました。 fuelのAuthはクッキーもセッションも同時に扱っちゃう感じなんですかね、、、
退会済みユーザー

退会済みユーザー

2017/12/09 10:28

私自身は、fuelphp を使用したことはありません。 が、フレームワーク内でセッションを利用する場合、フレームワークで用意されている以外のセッション機構を使用すると思わぬ不具合が発生する可能性があります。 fuel の Auth がどのような仕組みになっているのか追ったことはないですが、普通に考えると、フレームワークのセッション機構と密接に関連しているはずなので、php session に寄せるか、フレームワークのセッション機構 + Auth か、決め打ちが必要になると思います。
earnest_gay

2017/12/09 10:32

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

0

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

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

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

投稿2017/12/09 09:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2017/12/09 09:36

実装している段階ではなく、仕組みをまとめている段階です。
退会済みユーザー

退会済みユーザー

2017/12/09 09:41

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

2017/12/09 09:49

書いたりしないですね。
guest

0

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

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

投稿2017/12/12 02:46

TakeoSaki

総合スコア97

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問