什么是SQL注入
SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,它目前是黑客对数据库进行攻击的最常用手段之一。
SQL注入实例
绕过登录(只需知道用户名、无需知道密码即可登录成功)
实际userName=“zs”;password=“123”;
//模拟用户输入userName和password
String userName = "zs";
String password = "123";
String sql = "select * from user where username = '"+userName+" " +
"and password = '"+password+"' ";
黑客使用的方法
1. 使用–将password那部分的语句注释掉
String userName = "zs' --";
String password = "fdfdfdfdf";
String sql = "select * from user where username = '"+userName+" " +
"and password = '"+password+"' ";
2. 使用or
String userName = "zs' or 1=1";
String password = "fdfdfdfdf";
String sql = "select * from user where username = '"+userName+" " +
"and password = '"+password+"' ";
对应实际的SQL语句:
select * from user where username='zs' or 1=1 and password='dfdfdfdfdf';
用or将语句分为两部分: select * from user where username='zs'
和1=1 and password='dfdfdfdfdf';
预防SQL注入的方法
使用PrepareStatement类:预编译SQL,开发时常用这个类。
String sql = "select * from user" +
" where username = ? and password = ?";//?占位符
// 预编译SQL
PreparedStatement statement =
connection.prepareStatement(sql);
String userName = "zs or 1=1";
String password = "dfdfdfdfd";
statement.setString(1,userName);//传值给第一个占位符
statement.setString(2,password);
ResultSet resultSet = statement.executeQuery();
使用PrepareStatement的setXXX()方法传值.