JDBC: SQL注入问题
1 Sql注入演示
1) 向jdbc_user表中 插入两条数据
# 插入2条数据 INSERT INTO jdbc_user VALUES(NULL,'jack','123456','2020/2/24');
INSERT INTO jdbc_user VALUES(NULL,'tom','123456','2020/2/24');
2) SQL注入演示
# SQL注入演示
-- 填写一个错误的密码
SELECT * FROM jdbc_user WHERE username = 'tom' AND PASSWORD = '123' OR '1' = '1';
如果这是一个登陆操作,那么用户就登陆成功了。显然这不是我们想要看到的结果
2 sql注入案例:用户登录
需求
用户在控制台上输入用户名和密码, 然后使用 Statement 字符串拼接的方式 实现用户的登录。
步骤
1) 得到用户从控制台上输入的用户名和密码来查询数据库
2) 写一个登录的方法
a) 通过工具类得到连接
b) 创建语句对象,使用拼接字符串的方式生成 SQL 语句
c) 查询数据库,如果有记录则表示登录成功,否则登录失败
d) 释放资源
Sql注入方式:
<1> 控制台输入用户名: 任意字符串
<2> 控制台输入密码: XXX' 加上 or '1' = '1
代码示例
public class TestLogin01 { /** * 用户登录案例 * 使用 Statement字符串拼接的方式完成查询 * @param args */ public static void main(String[] args) throws SQLException { //1.获取连接 Connection connection = JDBCUtils.getConnection(); //2.获取Statement Statement statement = connection.createStatement(); //3.获取用户输入的用户名和密码 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名: "); String name = sc.nextLine(); System.out.println("请输入密码: "); String pass = sc.nextLine(); System.out.println(pass); //4.拼接Sql,执行查询 String sql = "select * from jdbc_user " + "where username = " + " '" + name +"' " +" and password = " +" '" + pass +"'"; System.out.println(sql); ResultSet resultSet = statement.executeQuery(sql); //5.处理结果集,判断结果集是否为空 if(resultSet.next()){ System.out.println("登录成功! 欢迎您: " + name); }else { System.out.println("登录失败!"); } //6. 释放资源 JDBCUtils.close(connection,statement,resultSet); } }
3 问题分析
1) 什么是SQL注入?
我们让用户输入的密码和 SQL 语句进行字符串拼接。
用户输入的内容作为了 SQL 语句语法的一部分,改变了 原有 SQL 真正的意义,以上问题称为 SQL 注入 .
2) 如何实现注入
根据用户输入的数据,拼接处的字符串
select * from jdbc_user where username = 'abc' and password = 'abc' or '1'='1' name='abc' and password='abc' 为假 '1'='1' 真 相当于 select * from user where true=true; 查询了所有记录
3) 如何解决
要解决 SQL 注入,就不能让用户输入的密码,和我们的 SQL 语句进行简单的字符串拼接
(见下篇)