A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

50黑马币
    String classDriverName = "com.mysql.jdbc.Driver";
        Class.forName(classDriverName);
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","123");
        Statement stmt = conn.createStatement();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名和密码,格式:姓名,密码");
        String line = sc.nextLine();
        String[] arr = line.split(",");
        String name = arr[0];
        String password = arr[1];
        ResultSet rs = stmt.executeQuery("select * from user where username = '"+name+"' and password = '"+password+"'");
        if(rs.next()) {
            System.out.println(rs.getString("username")+"登录成功");
        }
        else {
            System.out.println("登录失败");
        }
        rs.close();
        stmt.close();
        conn.close();

以上是我代码,我的思路是根据用户输入的用户名和密码进行查表,假如rs集合是空,代表用户输入的用户名和密码不正确。

面试老师说我这个不行。
一定要以下做法:
    String classDriverName = "com.mysql.jdbc.Driver";
        Class.forName(classDriverName);
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","123");
        Statement stmt = conn.createStatement();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名和密码,格式:姓名,密码");
        String line = sc.nextLine();
        String[] arr = line.split(",");
        String name = arr[0];
        String password = arr[1];
        ResultSet rs = stmt.executeQuery("select * from user");
    while(rs.next()) {
            if(rs.getString("username").equals(arr[0])  && rs.getString("password").equals(arr[1])) {
                System.out.println("登录成功");
                break;
            }
            else {
                System.out.println("登录失败");
                break;
            }
        }
这个代码我后面看了下,还是错的。
第一行记录不匹配为什么就直接说错了?你匹配的才是第一行记录呢。
要换这种思路:也是应该这样做啊
    String classDriverName = "com.mysql.jdbc.Driver";
        Class.forName(classDriverName);
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","123");
        Statement stmt = conn.createStatement();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名和密码,格式:姓名,密码");
        String line = sc.nextLine();
        String[] arr = line.split(",");
        String name = arr[0];
        String password = arr[1];
        ResultSet rs = stmt.executeQuery("select * from user");
        boolean flag = false;
        while(rs.next()) {
            if(rs.getString("username").equals(arr[0])  && rs.getString("password").equals(arr[1])) {
                flag = true;
                break;
            }
            
        }
        if(flag) {
            System.out.println("登录成功");
        }
        else {
            System.out.println("登录失败");
        }

我就想问下,我自己的做法有错嘛?有存在弊端?

最佳答案

查看完整内容

你的做法存在 SQL 注入风险吧。。。

7 个回复

正序浏览
还没学到JDBC,感觉是时候研究一下了
回复 使用道具 举报
因为用户在输入密码的时候可以输入一个恒成立的条件  例如’  OR 1=1’  这样就恒成立了,查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。   
使用preparestatement解决  就是先在前面加入 “?”占位符来占位,这样就不存在安全问题了,
void setObject(int parameterIndex,Object x) throws SQLException
望采纳

点评

学到了 正解  发表于 2016-7-20 22:06
回复 使用道具 举报
阳光下的契约 来自手机 中级黑马 2016-7-19 12:27:18
板凳
在我看来,你前面个对于帐号密码的判断查询存在问题,不能有效的进行输入帐号和密码的识别,存在SQL注入的风险,没有健壮性,一般企业绝对不允许这样的判断;对于后面一个你写的那个增加了一个状态判断是可以的。希望对你有帮助
回复 使用道具 举报
我只能说老师可能就是想考你字符串比较的方法,其实我也感觉你的效率高些,但是不安全
回复 使用道具 举报
cat73 发表于 2016-7-18 18:24
你的做法存在 SQL 注入风险吧。。。

应用与实际项目上确实是有这个风险的。关于SQL注入可以用PreparedStatement直接解决。
但是我现在的着重点,主要在于老师给的所谓标准答案思路和我的思路,我感觉我的效率高多了。不用一条条比较呢。
回复 使用道具 举报
cat73 黑马帝 2016-7-18 16:12:19
楼主
你的做法存在 SQL 注入风险吧。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马