【问题标题】:Why JSP not running this 'if(s1.equals(s3))' statement even if the condition is true for it?为什么即使条件为真,JSP 也不运行这个“if(s1.equals(s3))”语句?
【发布时间】:2015-07-11 17:23:07
【问题描述】:

我编写了一个程序,其中用户输入用户名和密码,这些用户名和密码存储到数据库中。但是首先 ResultSet 查询检查用户名输入是否已经在数据库中可用,然后在“if”语句中运行代码块并且不添加用户名输入。否则它会。但是在这个程序中,每当用户输入数据时,即使用户输入与数据库中的用户名查询匹配,它也会被插入到浏览器中

表格:

<body>
    <form name="loginForm" method="post" action="log.jsp">
        Username:<input type="text" name="user" />
        <br/>
        PassWord:<input type="password" name="pass">
        <br/>
        <input type="submit" value="Sign Up!">
    </form>

</body>

log.jsp:

<%@ page import= "java.sql.*" %>


    <%
        String s1=request.getParameter("user");
        String s2=request.getParameter("pass");

        Connection con=null;
        Statement st=null;
        ResultSet rs=null;

        try{

            Class.forName("oracle.jdbc.driver.OracleDriver");
            con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","pass");

            if (s1.equals("") || s2.equals("")){
                out.println("<script>alert('Please Enter valid credentials');</script>");

            }
            else{
                st=con.createStatement();
                rs=st.executeQuery("select users from NewUsers");
                while(rs.next()){
                    String s3=rs.getString("users");
                    if(s1.equals(s3)){
                        out.println("Username already exists");
                    }
                    else{
                        try{
                           st.executeUpdate("insert into NewUsers(users,pass) values('"+s1+"','"+s2+"')");
                        }
                        catch(SQLException sql){}
                        finally{
                            out.println("Signed Up , Go here for login:<a href='login.jsp'>Here</a> ");  
                        }

                    }
                }
            }

        }
        catch(ClassNotFoundException cnfe){}
        finally{
            if(st!=null)try{st.close();}catch(SQLException ignore){}
            if(rs!=null)try{rs.close();}catch(SQLException ignore){}
            if(con!=null)try{con.close();}catch(SQLException ignore){}
        }

        %>

我不明白为什么即使没有输入任何内容,else 语句也没有执行?输入中有一些默认值吗?

编辑: 想通了:

ps=con.prepareStatement("select users from NewUsers u where u.users=?");
ps.setString(1,s1);
rs=ps.executeQuery();
if(rs.next()){
out.println("<script>alert('User already exists')</script>");
 }else{//dbUpdate}

【问题讨论】:

标签: java jsp servlets jdbc


【解决方案1】:

你的逻辑完全有缺陷。要检查输入的用户是否存在于数据库中,您需要执行一个查询,从数据库中加载所有用户。然后循环遍历所有用户,对于每个用户,如果与输入的用户不同,则插入新用户。

这没有意义。

使用 SQL 查询检查输入的用户是否存在于数据库中。由于您的下一个错误将是使用字符串连接来创建该 SQL 查询,因此请避免犯该错误并学习使用包含参数的prepared statements

select users from NewUsers u where u.users = ?

PS:实际上,您已经犯了这个错误,使您的代码容易受到 SQL 注入攻击,并且在用户名或密码中有单引号时无法立即运行。

【讨论】:

  • 没有。正如我的回答所解释的,通过相应教程的链接,可以使用 prepared 语句来完成。
  • 感谢您的回复。您能否详细说明,该代码如何导致 sql 攻击?我是初学者。我会很感激我能得到的任何知识。
  • @chanchalkarn:JB Nizet 使用的确切短语——“SQL 注入攻击”——在 Web 上出现了数十万次。第一个谷歌点击是详细的维基百科文章。请付出一点努力。
  • 我搜索了它。我的意思是指这段代码。所以下次我看到这个错误时,我会解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2016-10-03
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
相关资源
最近更新 更多