使用Java中的过滤器验证用户名,密码(与数据库联系)

Ram*_*u4u 10 authentication jsp servlets login servlet-filters

以下是使用过滤器的Java代码片段,如果用户名和密码也正确,则每次都会显示错误页面.请帮帮我,我对这个概念知之甚少.

String sql="select * from reg where username='"+user+"' and pass='"+pwd+"'";
rs=st.executeQuery(sql);
if(rs.next())
{
    chain.doFilter(request,response);
}
else
    sc.getRequestDispatcher("/error.html").forward(request,response);
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 31

String sql ="select*from reg where username ='"+ user +"'and pass ='"+ pwd +"'";

这是一个非常糟糕的做法.这种方法要求用户名和密码都通过请求传递普通香草.而且,你有一个SQL注入攻击漏洞.

利用会话,在JSP/Servlet中就可以了HttpSession.实际上也没有必要在使用a的每个请求上一次又一次地击中DB Filter.这是不必要的昂贵.只需User使用a进行会话,Servlet并使用它Filter来检查每个请求的存在.

从以下开始/login.jsp:

<form action="login" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit"> ${error}
</form>
Run Code Online (Sandbox Code Playgroud)

然后,创建一个LoginServlet映射的url-pattern,/logindoPost()实现如下:

String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userDAO.find(username, password);

if (user != null) {
    request.getSession().setAttribute("user", user); // Put user in session.
    response.sendRedirect("/secured/home.jsp"); // Go to some start page.
} else {
    request.setAttribute("error", "Unknown login, try again"); // Set error msg for ${error}
    request.getRequestDispatcher("/login.jsp").forward(request, response); // Go back to login page.
}
Run Code Online (Sandbox Code Playgroud)

然后,创建一个LoginFilter这是在映射url-pattern/secured/*(你可以选择你自己不过,如/protected/*,/restricted/*,/users/*,等,但必须至少覆盖所有受保护的页面,你也需要把JSP的在的WebContent相应的文件夹),并有doFilter()实施如下:

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String loginURI = request.getContextPath() + "/login.jsp";

boolean loggedIn = session != null && session.getAttribute("user") != null;
boolean loginRequest = request.getRequestURI().equals(loginURI);

if (loggedIn || loginRequest) {
    chain.doFilter(request, response); // User is logged in, just continue request.
} else {
    response.sendRedirect(loginURI); // Not logged in, show login page.
}
Run Code Online (Sandbox Code Playgroud)

那应该是它.希望这可以帮助.

为了了解它的UserDAO外观,您可能会发现本文很有用.它还介绍了如何使用PreparedStatement从SQL注入攻击中保存Web应用程序.

也可以看看:


Jer*_*ome 3

使用准备好的语句,您的代码就是对SQL 注入的公开邀请。

Connection con = getMyConnection();
        try {
                //no string concatenation, we use ? instead:
                PreparedStatement ps = con.prepareStatement("select * from reg where username=? and pass=?");
                try {
                        //actual value for parameters are set here:
                        ps.setString(1, user);
                        ps.setString(2, pwd);
                        ResultSet rs = ps.executeQuery();
                        if(rs.next()) {
                                chain.doFilter(request,response);
                        } else {
                                sc.getRequestDispatcher("/error.html").forward(request,response);
                        }

                } finally {
                        ps.close();
                }
        } finally {
                con.close();
        }
Run Code Online (Sandbox Code Playgroud)

现在针对您的问题,请检查:

  • 表名和列名是否正确(您没有“登录名”和“用户名”列吗?)
  • 这些值确实正确(例如尝试 sqldevelopper 中的查询)
  • 它适用于 ascii-7 密码和用户名(可能是编码问题)
  • 密码列包含真实密码而不是它的哈希值