#Java JDBC 使用Statement 产生sql注入问题
- Statement 对象用于执行静态SQL语句并返回其生成的结果对象
Statement 对象执行SQL语句,存在SQL注入风险
代码演示:
- 先创建一张表
-- 演示 sql 注入
-- 创建一张表
CREATE TABLE admin ( -- 管理员表
NAME VARCHAR(32) NOT NULL UNIQUE,
pwd VARCHAR(32) NOT NULL DEFAULT '')
CHARACTER SET utf8;
-- 添加账号数据
INSERT INTO admin VALUES('jack', '12345');
- 演示 statement 的注入问题
public class StatementDemo {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in); //让用户输入管理员名和密码
System.out.print("请输入账号: ");
// next(): 当接收到 空格或者 '就是表示结束 这里用nextLine()
String admin_name = scanner.nextLine();
System.out.print("请输入密码: ");
String admin_pwd = scanner.nextLine();
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
//获取相关的值
String user = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/db01";
String driver = "com.mysql.jdbc.Driver";
//1.建立连接
Class.forName(driver);
//2.得到链接
Connection connection = DriverManager.getConnection(url, user, password);
//3.得到statement
Statement statement = connection.createStatement();
//4.编写sql
//这里故意
//-- 输入用户名 为 1' or
//-- 输入万能密码 为 or '1'= '1
String sql = "select name , pwd from admin where name = '"
+ admin_name + "'and pwd = '" + admin_pwd + "'";
//执行给定的 SQL 语句,该语句返回单个 ResultSet 对象
ResultSet resultSet = statement.executeQuery(sql);
//5.使用while获取数据
if (resultSet.next()) { //如果查询到一条记录,则说明该管理存
System.out.println("恭喜, 登录成功");
} else{
System.out.println("对不起,登录失败");
}
//6.关闭连接
statement.close();
connection.close();
resultSet.close();
}
}
代码中的sql就相当于将本来的SELECT语句给改写了,将WHERE后面的条件永远成立
相当于: name = ‘1’ 或者= ‘AND pwd’ 或者 ‘1’=‘1’;
可以看出不管怎样最后一个1=1必然成立,所以这个语句就会执行成功
- SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库。
- 要防范SQL注入,只要用 PreparedStatement(从Statement扩展而来)取代Statement 就可以了。