12

私は「remember me」機能を備えたログインフォームをコーディングしている最中です。これまでに読んだチュートリアル (部分的には正しく行っていることを確認するため) はすべて、暗号化されたパスワードを Cookie に保存するように言っています。ユーザー名で。次に、PHP が現在のユーザーがログインしていないかどうかを確認するたびに、Cookie を確認し、それらの値を探します。ユーザー名がパスワードと一致する場合は、ログインしています。

私にとって、これは大きなセキュリティ ホールです。誰かがデータベースをハッキングしたり、何らかの方法で暗号化されたパスワードにアクセスしたりしたとしても、解読する必要さえありません。独自の Cookie を設定するだけです。私は正しいですか、それとも単に妄想的ですか?

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

ユーザーのセキュリティを非常に気にかけていますが、機能している Web サイトを維持しながらユーザーの情報を適切に保護するにはどうすればよいですか?

4

4 に答える 4

11

通常、サーバーがユーザーを記憶するように要求されると、通常のセッション Cookieのほかに追加の Cookie が発行されます。この新しい文字列には、ユーザー名と、推測できないほどのランダムな文字が含まれています。これは明らかにデータベースに保存されます(セキュリティ上の理由から、パスワードのように扱い、ソルトとハッシュを使用することができます)。次にユーザーが同じブラウザに接続すると(古いセッションの有効期限が切れていると仮定します)、アプリケーションはランダムな文字列、データベースをチェックし、一致する場合、ユーザーは認証されます。

別の方法は、セッションの有効期限をある程度前にずらすことです。

ここにはどのようなセキュリティ ホールがありますか? 適切な乱数発生器を使用していれば、ユーザーが共有ブラウザーからアプリケーションにアクセスし、アプリケーションが終了したときに手動でログアウトしないということだけが起こり得ます。

安全でないチャネルを使用しているため、通常のルールが常に適用されます。HTTPS を使用します。そうしないと、コンピューターとサーバーの間にいる人は誰でも Cookie (セッション 1 またはremember-me 1) を盗み、あなたであるかのように振る舞うことができます。

おまけに、これは Jeff Atwood の必読です

于 2013-01-02T23:37:14.280 に答える
2

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

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

PHP を使用すると、このようなランダム キーを生成できますmd5(uniqid(mt_rand(), true))。より安全に保管するために、データベースでソルト化およびハッシュ化しました。

表の例:

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

また、 HTTP のみの Cookieオプションを有効にする必要があることにも注意してください。

于 2013-01-03T00:17:34.660 に答える
0

セキュリティを確保したい場合は、ユーザーがログインしたままにならないようにしてください。

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

于 2013-01-02T23:40:53.257 に答える
-3

私は自分の Web サイトで作業しているときに同じ問題に遭遇しました。これを解決する最善の方法は、パスワードを覚えずにユーザー名だけを覚えて、より高速なログインを提供することでしたが、安全性が低下することはありませんでした。実際のところ、パスワードを完全に安全に保つ確実な方法はありません。新しいブラウザーのほかに、ユーザーはブラウザーにそれを記憶させることができます。

ただし、パスワードを保存する必要がある場合は、次のことを試してください。

複数の Cookie を用意します。2 つが最も簡単で、1 つを暗号化されたパスワードに使用し、もう 1 つには暗号化キーを保持します。データベース内のパスワードには、保存された暗号化キーを使用して取得された、さらに暗号化されたパスワードが保持されます。パスワードを確認する準備ができたら、値を抽出してパスワードを暗号化します。

これがお役に立てば幸いです。幸運を!

編集:これを誤解している可能性があります。ユーザーがまだログインしている場合は、セッション変数を保存することをお勧めします。

于 2013-01-02T23:37:07.270 に答える