一.简述
- SQL注入:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。
二.问题还原
用户登录。
/*
* SQL注入演示
* */
public static void main(String[] args) throws Exception {
//定义用户名和密码(将来从前端页面传递而来)
String username = "admin";
//还原SQL注入
String password = "'or''='";
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/day02_db", "root", "1234");
//3、获取发送SQL语句对象
Statement st = con.createStatement();
//4、发送SQL语句,返回结果集
String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";
System.out.println(sql);
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
System.out.println("username:"+rs.getString("username")+"\t password:"+rs.getString("password"));
}
//5、关闭资源
rs.close();
st.close();
con.close();
}
三.问题解决
解决根本: 把用户输入中的特殊字符,尤其是 ‘ 去掉。
- 解决方案:转义 \’ 。 \’不再隔断SQL语法,作为SQL参数值出现
原生JDBC:preparedStatement, 把SQL语句中的特殊字符全部进行转义。
不建议直接拼接字符串,建议使用?占位符赋值。
Mybatis中:
#{} ======> preparedStatement的?占位符,解决SQL注入
${} ======> 相当于 Statement 进行字符串的拼接,引起SQL注入
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!
注: 如果本篇有需要改进的地方或错误,欢迎大神们指定一二~~