0
点赞
收藏
分享

微信扫一扫

【大数据系列之JDBC】(四):Statement存在SQL注入问题


  • 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果。其实一个数据库连接就是一个Socket连接。
  • 在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式:
  • Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。
  • PrepatedStatement:SQL 语句被预编译并存储在此对象中,可以使用此对象多次高效地执行该语句。
  • CallableStatement:用于执行 SQL 存储过程

【大数据系列之JDBC】(四):Statement存在SQL注入问题_java

但是使用Statement会存在SQL注入问题,SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令(如:SELECT user, password FROM user_table WHERE user=‘a’ OR 1 = ’ AND password = ’ OR ‘1’ = ‘1’) ,从而利用系统的 SQL 引擎完成恶意行为的做法。

比如如下代码:

public static void testLogin() {
Scanner scanner = new Scanner(System.in);

System.out.print("请输入用户名:");
String user = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
//SELECT user,password FROM user_table WHERE user = '1' or ' AND password = '=1 or '1' = '1'
String sql = "SELECT user,password FROM user_table WHERE user = '" + user + "' AND password = '" + password + "'";
User returnUser = get(sql, User.class);
if (returnUser != null) {
System.out.println("登录成功");
} else {
System.out.println("用户名不存在或密码错误");
}
}

如果用户输入如下:

【大数据系列之JDBC】(四):Statement存在SQL注入问题_大数据_02

这样依旧会登录成功,这是为什么呢?

对于SQL来讲是一个字符串,他会将该字符串解析成SQL语句来执行,如果输入方式如上,最终的SQL语句则会解析为:

select user,password
from user_table
where user = '1' or ' and password = '=1 or '1' = '1'

正常来将要用户名和密码全部匹配成功才可查询到,但是经过SQL注入后,上面的SQL后面会多一个 ​​1=1​​ 的条件,这样无论我们输入的用户名和密码是否正确,都会使得筛选条件为true,产生上面的原因就是将原来的SQL语句经过改装,导致解析为新的SQL语句,变得不安全。


举报

相关推荐

0 条评论