0

実装したい:

ユーザーが無効なユーザー名とパスワードで3回以上ログインしようとした場合。「パスワードのリセットページ」に転送したいのですが。

この背後にあるロジックは何ですか。この問題の正確な論理を把握することはできません。助けてください。

私が適用しようと思ったこと:フォームからのようにフォームのテキストフィールドからデフォルト値を渡すLogin_attempt=1

//geter & setter of loginAttempt
if(loginAttempt>3)
{
    return resetPassword;//forwarding to resetPassword.jsp from my struts.xml
} 
else
{    
    //perform other tasks
}

しかし、上記の論理から、私は疑問を持っていますloginAttempt。フォームが送信されるたびに値をインクリメントするにはどうすればよいですか。上記のコードが機能するようにします。

実装する他のロジックがある場合。私と共有してください。

4

2 に答える 2

2

試行回数はhtmlの一部であるため、必要に応じてこれを行うとセキュリティホールになり、誰でも変更できるようになります(特別なツールは必要ありません。たとえば、chrome開発ツールを使用して変更できます)。したがって、これを念頭に置いて、悪意のあるユーザーがプログラムを作成して、ブルートフォース攻撃を無限に試みる可能性があります。

このセキュリティギャップを回避するには、次のいずれかのアプローチを使用できます。

  • セッションでの試行回数を保存します。私の意見では、Struts2をフレームワークとして使用していることを考えると、これが最も簡単な方法です。Struts2アクションでセッションを取得するには、SessionAwareインターフェイスを実装する必要があります。また、ユーザーが正常にログインしたら、試行の値をリセットすることを忘れないでください。

  • 一部の開発者はセッションの使用を好まないため、データベースを使用します。これは、特にWebサイトに多数のユーザーがいる場合、パフォーマンスの点でセッションよりも優れたアプローチです。

  • もう1つのオプションは、フォームでCookieまたは非表示のパラメーターを使用するが、その情報を暗号化することです(最初のオプションは、たとえばRuby on Railsフレームワークのアプローチです)。

最適な選択は、プロジェクトの要件によって異なります。私自身の意見では、最後のオプションをサポートするフレームワークまたはツールを使用している場合を除いて、最後のオプションを使用しないでください。

他の2つのオプションから選択するための適切な指標は、Webサイトに期待するユーザーの数です(少数の場合、またはプライベートWebサイトを実行している場合は、セッションの方が適切な場合があります。データベースは常に問題ありませんが、必要な開発時間は通常より長く、保守性にとって少し有害かもしれません)。

もちろん、これにはもっと多くの解決策がありますが、私は最も一般的なものをカバーしたと思います。

于 2012-12-26T15:31:51.437 に答える
1

完全にテストされていない、新しい質問に大まかに答えるには:

public class LoginAction {
    // Getters, setters, password checking, utils, etc. elided.

    public String execute() {
        return tooManyAttempts(password) ? RESET_PASSWORD : SUCCESS;
    }

    public boolean tooManyAttempts(String password) {
        Integer attempts = default(session.get(LOGIN_ATTEMPTS), 0);
        attempts = passwordCorrect() ? 0 : attempts + 1;
        session.put(LOGIN_ATTEMPTS, attempts);
        return attempts > 3;
    }
}

あなたのコードは少し読みにくいです。

于 2012-12-28T16:19:54.677 に答える