0

我开始探索 Servlets 和 JSP 的世界,并成功创建了登录系统。但它的实现并不像我想象的那么完美。

塞纳里奥:

1> 用户在 index.jsp 中输入用户名和密码。

2> 将请求发送到Servlet(login.login.java)

3> servlet 连接到数据库并检查用户是否有效。(使用 LoginBean.java 、 LoginDB.java 和 GetConnection.java 即一个 bean 类、 Database QueryClass 和 DB connection Class resp)

4> 如果用户被验证,

5> 用户被重定向到 home.jsp

别的

Error.jsp(这只是 index.jsp 的副本,添加了一些消息)

问题:

1> 如果我只是在浏览器中打开 index.jsp 并将 URL 更改为 home.jsp,我可以绕过 servlet。

2> 如果我尝试使用 MD5 将密码存储在 mysql 中,即 PASSWORD('mypass') 我没有通过身份验证。

这是我的 doPOST 方法


  @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String user = request.getParameter("user");
        String pass = request.getParameter("pass");
        LoginBean bean = new LoginBean();
        bean.SetUser(user);
        bean.SetPass(pass);
        bean = LoginDB.check_login(bean);
        if (bean.isValid()) {
            HttpSession session = request.getSession(true);
            session.setAttribute("currentSessionUser", user);
            response.sendRedirect("home.jsp");
        } else {
            response.sendRedirect("Error.jsp");
        }
    }

I tired to Modify my Home.jsp and check for a valid session before loading the page. Using the Following

<% 
   if(!session.isNew())
   {
      response.sendRedirect("index.jsp");
   }
%>

这修复了 URL 嗅探,但它阻止了有效用户被重定向到 home.jsp

更新:

正如 JB Nizet 所建议的那样,我正在尝试对此实施过滤器。但正如我所说,我是一名学习者,所以我不太确定如何实现这一目标:

我必须在我的 doFilter 方法中做什么?

我将 ServletRequest 对象转换为 HttpRequest 对象

使用

HttpServletRequest req = (HttpServletRequest) 请求;

现在使用这个 req 对象,我用户如何实际单击 sumbit 按钮或直接更改 URL 以绕过 Servlet?

对不起,这一定是非常初级的,但我现在已经为此思考了好几个小时。请帮帮我

问候

Genocide_Hoax

4

1 回答 1

1

不要使用Session.isNew(). 会话处理和身份验证是两个不同的东西。未经身份验证的用户可以(并且将会)拥有一个非新会话。

您应该使用 servlet 过滤器,它将拦截发送到您的应用程序的每个请求。此过滤器应检查请求的 URL 是否需要身份验证。如果是这样,并且当前用户未通过身份验证,则应重定向到登录页面。

一旦通过身份验证,您应该将用户身份存储在会话中。这将允许区分经过身份验证的会话和未经身份验证的会话。这也是允许在应用程序中检索当前用户的原因。

当然,请确保不要在需要身份验证的 URL 集中包含登录 URL。

过滤器比在每个页面中检查身份验证更加安全和干净。它使事情集中化,避免一次又一次地重复相同的代码,并且没有忘记在某些页面中添加所需检查的风险。

另外,请尊重 Java 命名约定。Java 中的方法以小写字母开头。

于 2013-03-15T12:02:51.283 回答