web-dev-qa-db-ja.com

ユーザーをログインさせておくための正しい安全な方法は何ですか?クッキー?セッション? PHP && MYSQL

後でユーザーを正しくログアウトする方法を尋ねていたところ、ユーザーをログインしたままにするためにCookieのみを使用することはまったく安全ではないことがわかりました。

パスワードをCookieに保持することは安全な方法ではありません。そのため、私の質問は、私のWebサイトで(ログイン/ユーザーのログインを維持する)正しい方法は何ですか?

現在、URLにXユーザープロファイルを表示するために必要なユーザーIDと、MD5で暗号化された電子メールとパスワードを保存しています。

Setcookieは、ログインに成功したときに使用する唯一の関数です。繰り返しのフォーム送信を回避するために、セッションを使用して乱数を保存するだけです。非表示フィールド。

•それを行うための正しい安全な方法を教えていただけますか?
•それを行うためのあなたの方法は何ですか?

PHPのみ。 phpで2か月間、すべて答えから学んだ。ありがとう

25
Bona Chon

まず、これをお話ししましょう。 100%安全なものはありません。気密性がなく、神聖なものはありません。十分な動機があると、攻撃者はサーバーサイドの防御策をすべて破ります(別の話であるHTTPSを使用している場合を除きます)。

Cookieを使用できますが、Cookieは非常に公開されており、簡単に変更できます。個人データやアクセスレベルをCookieに保存しないでください。攻撃者による盗難/改ざんが容易であるため。

セッションも100%安全ではありません。サーバーがクライアントを識別するために使用するセッションIDは、2つの方法のいずれかで送信されます。 $ _GET変数(不良)、またはcookie(より良いが、それでもかなり悪い)。つまり、管理者としてログインしている場合、セキュリティ保護されていないWiFiを介して、熟練した攻撃者(つまり、熟練した攻撃者は単純なHTTPスニファをダウンロードしたpr0 haxx0r)がSESSION IDを簡単に盗むことができるということです。そして、あなたのパスワードを取得していない間、サーバーは攻撃者をあなたであると誤って識別し、あなたが持っている/持っていたアクセスを彼に許可します。

じゃあ何をすればいいの?セッションはほとんどの場合安全です。セキュリティで保護されていないネットワーク(バス、インターネットカフェなど)でログインしないようにユーザーにアドバイスします。ユーザー認証を長期間保持する場合は、Cookieが必要です。私はそれが必要な場合、通常2つのCookieシステムを使用します。

userid=12345
hash=password_hash($userid . $hashed_password, PASSWORD_DEFAULT)

次に、一致するものがあり、ユーザーの詳細は明らかにされませんでした。


しかし、私が言ったように、結局のところ、本当にユーザーを保護したいのであれば、この回答に書かれている他のすべてのものよりも上に、HTTPSを入手してください。

37
Madara's Ghost

セッションを使用します。

セキュリティを少し助けるために、ユーザーの資格情報が確認されたら session_regenerate_id を使用します。セッションIDはCookieで渡されるものであるため、処理中にログインしているときに誰かが傍受する場合に重要です。

アクセス資格情報に関連する情報をセッションに保存しないでください。多くの場合、userIdで十分です。個人的には、セッションに保存するユーザーオブジェクトを作成します(これらは、要求間で自動シリアル化/非シリアル化されますが、独立して読み取ることができます)。

次の訪問時にユーザーがログインする必要がないようにCookieを設定する場合は、おそらくuserIdとデータベースでチェックできる自動生成トークン(または同様のもの)を保存します-チェックにも追加します-同様に、最後のipaddressをチェックするトークンと共に保存し、一致しない場合は、もう一度ログインを要求します。

取れるアプローチはかなりたくさんあります-私はすべてを提供していません/「最高」-あなたのコードをphpコミュニティの人々にレビューしてもらってください-あなたはその方法についてもっと学びます。

9
Ian Wood

ユーザーがログイン名とパスワードを持っている場合、ブラウザでCookieとして設定できるため、訪問するたびにWebサイトに再ログインする必要がありません。あなたはブラウザのクッキーにほとんど何でも保存できます。問題は、ユーザーがいつでもCookieをブロックまたは削除できることです。たとえば、WebサイトのショッピングカートでCookieを使用していて、ユーザーがブラウザを設定してそれらをブロックすると、Webサイトで買い物をすることができなくなります。

Cookieにデータを保存する場合は、ユーザーがデータを改ざんできないようにする必要があります。ユーザーがCookieのデータを変更できないようにする方法はありません。とんでもないほど簡単です。したがって、変更されたデータを含むCookieがWebサイトで受け入れられないようにするには、Cookieの値を暗号化するか、整合性を検証できるハッシュで署名する必要があります。

5
Moyed Ansari

PHPセッションを使用することをお勧めします。

PHPセッションは、ブラウザがセッションIDと呼ばれる暗号的に安全な(つまり、次の有効な値を推測できない)文字列を返すことで維持されます。 そのセッション中にリクエストを行うたび。ブラウザにセッションCookie、リクエストごとに送信されます。

セッションCookieを使用する別の方法は、PHPセッションIDをリクエストURL自体にGETとして含めることです変数。URLの例は次のようになります。

https://www.example.com/mypage.php?PHPSESSID=cteekbf64igp5vdjjkktvoeb97

これは、URLが他の方法で誤って共有または盗まれる可能性があるため、Cookieを使用する場合ほど安全ではありません。

セキュリティは、玉ねぎのように(一般的な例が示すように)階層化されています。安全なものを作るほど、安全にするために必要な労力が増え、使い勝手が悪くなります。これは費用対効果のトレードオフです。したがって、データの重要性、ユーザーのプライバシーと安全性などについて質問する必要があります。

私にとって、基本的なレベルは、セッションIDがCookie内に強制される(Cookieを無効にするユーザーをブロックする)PHPセッション)、データとCookieの両方で常にSSL暗号化を使用することです、そしてセッションのセキュリティに影響を与えるさまざまなPHP=設定が最良で最も安全な設定に設定されていることを確認してください。これらのページと子ページのすべてを読みたいと思うでしょう:

3
CXJ

@Madaraが言ったように100%安全で正しいものは何もありませんが、開発者の視点として、ユーザーのセッションデータを保持する方法にはそれぞれ独自の利点と欠点があると言います。

Cookieとセッションのユーザーデータ

ユーザーのセッションデータをCookieに保持している場合は、サーバーの消費量が少なくなりますRAM記録されたユーザーの情報をRAMに保持する必要がないため、メモリおよび処理。ユーザーが増加した場合、セッションではなくCookie内のユーザーセッションデータ。これは、セッションでサーバーリソースを消費し、アプリケーションの速度が低下して応答しなくなる場合があるためです。ユーザーのログインデータをセッションに保持している場合と同様に、Cookieよりも安全ですが、消費量が多くなります。サーバーリソース。

最後の注記:アプリケーションがHTTPSプロトコルを使用している場合でも、独自の実装では両方の方法が正しいため、セキュリティは問題になりません。したがって、アプリケーションとビジネスモデルの要件に応じて、ユーザーのセッションデータを保持する方法を使用することをお勧めします。

2
Deepak