黑马程序员技术交流社区
标题:
jdbc链接数据库,判断用户名密码问题。
[打印本页]
作者:
Ake丶
时间:
2016-7-18 16:12
标题:
jdbc链接数据库,判断用户名密码问题。
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("登录失败");
}
我就想问下,我自己的做法有错嘛?有存在弊端?
作者:
cat73
时间:
2016-7-18 16:12
你的做法存在 SQL 注入风险吧。。。
作者:
Ake丶
时间:
2016-7-18 18:34
cat73 发表于 2016-7-18 18:24
你的做法存在 SQL 注入风险吧。。。
应用与实际项目上确实是有这个风险的。关于SQL注入可以用PreparedStatement直接解决。
但是我现在的着重点,主要在于老师给的所谓标准答案思路和我的思路,我感觉我的效率高多了。不用一条条比较呢。
作者:
赛后追溯
时间:
2016-7-18 22:22
我只能说老师可能就是想考你字符串比较的方法,其实我也感觉你的效率高些,但是不安全
作者:
阳光下的契约
时间:
2016-7-19 12:27
在我看来,你前面个对于帐号密码的判断查询存在问题,不能有效的进行输入帐号和密码的识别,存在SQL注入的风险,没有健壮性,一般企业绝对不允许这样的判断;对于后面一个你写的那个增加了一个状态判断是可以的。希望对你有帮助
作者:
自娱自乐的朋朋
时间:
2016-7-20 16:36
因为用户在输入密码的时候可以输入一个恒成立的条件 例如’ OR 1=1’ 这样就恒成立了,查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。
使用preparestatement解决 就是先在前面加入 “?”占位符来占位,这样就不存在安全问题了,
void setObject(int parameterIndex,Object x) throws SQLException
望采纳
作者:
hushaojie@0719
时间:
2016-7-27 23:01
还没学到JDBC,感觉是时候研究一下了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2