2013-01-02 20 views
11

私は「私を覚えている」ログインフォームを覚えているのですが、今まで読んできたチュートリアル(部分的に私が正しいことを確認するために)は、すべて暗号化されたパスワードをユーザー名と共にクッキー次に、PHPが現在のユーザーがログインしていないかどうかを確認するたびに、Cookieをチェックしてその値を探します。ユーザー名がパスワードと一致する場合、あなたはログインしています。PHP「Remember Me」のセキュリティ上の欠陥?

私にとって、これはセキュリティ上の大きな穴です。誰かがデータベースをハッキングしたり、何らかの形で暗号化されたパスワードにアクセスしたりすると、パスワードを解読する必要はありません。ちょうどあなた自身のクッキーをセットして行ってください。私は訂正したのですか?

私のログインシステムは、現在のユーザーIDを追跡するためにセッションを使用し、迅速なログイン/ログアウトチェックのために1/0を使用します。ユーザーはAFAIKセッションを編集できないので、これは安全です(そうでない場合は教えてください)。セッションIDをクッキーに保存して後で再開することを考えていましたが、安全ではありません。

私はユーザーのセキュリティについて多くのことを心配していますが、機能しているウェブサイトを維持しながら、情報を適切に保護するにはどうすればよいですか?

+0

暗号化されたパスワードは保存されません.X日以内に有効期限が切れるCookieにuser_IDだけが格納されます。 「機密」領域(アカウント/プロファイル管理など)では、有効な$ _SESSION(ログイン時に設定する必要がある)がない場合にログインを要求することができます。 – JennyDanger

+1

クッキーに保存する場合、セッションIDをどのように保存していますか?「安全ではありませんか? –

+0

@georgefox現在、私は何にでもセッションIDを格納していません、私はそれが覚えている私の機能の可能性だと言っていました。 – Scott

答えて

11

サーバーがユーザーを覚えてに要求され、それは通常のセッションクッキーの横に追加のクッキーを発行し、この新しい文字列は、ユーザ名と、それは推測できない作るランダムな文字の合理的な量が含まれています。これは明らかにデータベースに保存されています(セキュリティ上の理由から、パスワードのように扱い、塩分とハッシュ)したい場合や、次回に同じブラウザに接続した場合(古いセッションが期限切れになっている)、アプリケーションはランダムな文字列でデータベースをチェックし、一致するものがあればユーザを認証します。

セッションの有効期限をある程度前に移動する方法もあります。

セキュリティホールは何ですか?良いランダムジェネレーターを使用する場合、ユーザーは共有ブラウザーからアプリケーションにアクセスし、終了時に手動でログアウトしないということだけが起こります。あなたが安全でないチャネル上にあるので、

通常ルール

が常に適用されます:HTTPSを使用してそれ以外の場合は誰でもコンピュータとクッキーを盗むことができるサーバの間で座っている、(セッションのいずれか一つまたは覚えて、私 1)とあたかもあなたのように行動してください。

Bonus, this must-read by Jeff Atwood

+0

これは良い方法のようです、ありがとう!また、そのモンスターのログインポストを今読んで! – Scott

-3

自分のウェブサイトで作業しているときにこの同じ問題が発生しました。パスワードを覚えていない方が簡単です。ユーザ名のみしか使用できません。実際、パスワードを絶対に安全に保つための確実な方法はないということです。新しいブラウザに加えて、ユーザーはブラウザにそのことを記憶させることができます。

しかし、あなたはこれを試して、保存されたパスワードが必要な場合:

は複数のクッキーを持って、2が最も簡単でしょう、そしてもう一方は、暗号鍵を開催しながら、暗号化されたパスワードのいずれかを使用します。データベースのパスワードには、保存された暗号化キーを使用して取得したさらに暗号化されたパスワードが保持されます。パスワードを確認する準備ができたら、値を抽出してパスワードを暗号化します。

希望しました。がんばろう!

編集:これは間違っているかもしれませんが、ユーザーがまだログインしている場合は、セッション変数を保存することをお勧めします。通常

+1

決してパスワードを保存しないでください(ログインに使用できる暗号化されたパスワードは依然としてパスワードです)。サーバーに保存されているキーのみを保存します。これらのキーは後で取り消すことができますが、暗号化されたパスワードは変更されるまで有効です。 –

+0

有効期限を設定するため、必ずしもそうであるとは限りません。しかし、私はむしろ私の2番目の方法を使用しないでください。 – Zero

0

あなたはそれが安全な場合は、ユーザーがログインしてそれらを維持することができますいけない。

セッションを設定する場合、誰かが選ぶ場合ように、セッションIDにIPアドレスをバインドするようにしてください後でセッションを開始するときは、同じIPアドレスからのみ実行できます。 これは、(ハッシュされた)セッションIDとハッシュされたIPアドレスをデータベースに保持することで実現できます。 私は、phps関数http://php.net/manual/en/class.sessionhandler.phpを使ってセッションハンドラを設定し、セッションとipaddressを一致させます。

+1

IPアドレスはセキュリティに使用するためのものではなく、IPアドレスを信頼できません。 IPチェックは、あなたが指摘しているように、悪い人たちの生活をもっと難しくしています。 –

2

クライアントでは、決してパスワードを保存しないでください(ログインに使用できる暗号化されたパスワードは引き続きパスワードです)。

無作為に生成されたキーを使用して、サーバーに安全に保存します。これらの鍵は、変更されるまで有効となる暗号化されたパスワードとは異なり、後で取り消すことができます。

PHPを使用すると、md5(uniqid(mt_rand(), true))のようなランダムなキーを生成できます。より安全な保管のために、それは塩漬けされ、dbでハッシュされました。

例テーブル:

login_keys (
    user_id int, 
    key char(40), # sha1 
    salt char(15) 
) 

はまた、あなたがHTTPのみクッキーにオプションを有効にする必要があります注意してください。

関連する問題