1

PHP アプリケーションのユーザー認証を作成しています。私のアプローチを批判してください:

  1. ログインに成功したら、session_regenerate_id() を実行し、新しい session_id、user_id、および有効期限を db テーブルに保存します。そのユーザーの古いセッションも削除します。

  2. 応答内の各リンクまたはフォーム アクション URL には、token=jenjdf723jhfej (保存された session_id) のようなものが含まれます。

  3. 各リクエストは、データベースに保存されたセッションに対してチェックされます。トークンが有効なセッションと一致する場合、新しい session_id が生成され、データベースが更新されます。一致しない場合は、ログイン フォームを含めて終了します。したがって、トークンは 1 つのリクエストに対してのみ有効です。

このアプローチは安全ですか?

追加のチェックとして、リクエストのIPアドレスをデータベースに追加することを考えました。

優れた認証システムをお勧めいただければ、既存の認証システムを使用することにオープンです。

ありがとう

編集:私は実際にトークンを廃止し、有効なセッションのリストをphpセッションIDおよびその他の情報とともにデータベーステーブルに保存することにしました。リクエストをテーブルに対してチェックして、a) セッションの有効期限が切れていないこと、および b) ユーザーがログインしたのと同じ IP アドレスからリクエストが送信されたことを確認できます。

将来、使い捨てトークンを追加する可能性があります。その場合、おそらく次のようなもので生成します$token = md5(uniqid(rand(), true));

これは、この質問が有効でなくなったことを意味する場合がありますが、とにかくコメントをありがとう. モッズ/用務員、この質問であなたがしたいことをしてください。

4

1 に答える 1

1

独自のセキュリティ アルゴリズムを発明することは、ほとんどの場合、悪い考えです。

このアプローチは安全ですか?

あなたはアガニストを守ろうとしているのは何なのかを語っていませんが、おそらくそうではありません。

最初の問題は、システムが複雑になることです。複雑さ = バグ、バグはセキュリティを弱体化させます。

リクエストごとにセッション ID を変更すると、どのような価値が得られますか? CSRF から保護しようとしている場合は、セッションが有効であることを確認するために Cookie を使用します。

追加のチェックとして、リクエストのIPアドレスをデータベースに追加することを考えました

セッション中に IP アドレスを合法的に変更できないと思いますか? 負荷分散について聞いたことがありませんか? モバイルクライアント?

ユーザーが 2 番目のウィンドウを開くとどうなりますか? それとも戻るボタンを押しますか?

$token = md5(uniqid(rand(), true));

ここで変換を適用することにより、エントロピーを増加させるのではなく、減少させています。

于 2013-11-01T12:27:47.507 に答える