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 Action 中获取会话,您应该实现SessionAware接口。此外,一旦用户成功登录,不要忘记重置尝试的值。

  • 一些开发人员不喜欢使用会话,所以他们使用数据库。就性能而言,这是一种比会话更好的方法,特别是在您的网站拥有大量用户的情况下。

  • 另一种选择是在表单中使用 cookie 甚至隐藏参数,但对其信息进行加密(例如,第一个是 Ruby on Rails 框架的方法)。

最佳选择取决于您的项目要求。在我自己看来,除非您使用一些支持它的框架或工具,否则您不应该使用最后一个选项。

要在其他两个选项之间进行选择,一个好的指标是您希望您的网站拥有的用户数量(如果您的用户数量很少或者您正在做一个私人网站,那么会话可能是一个更好的方法。数据库总是很好,但是所需的开发时间通常更长,并且可能对可维护性更有害)。

当然,还有更多的解决方案,但我想我已经介绍了最常见的。

于 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 回答