通过PreperedStatement预防主注入
PreperedStatement的优点
1 预防sql注入 占位符作为实参来定义sql语句,从而避免sql注入的攻击。
2 Statement 频繁使数据库编译SQL ,造成数据库缓存区溢出
3 在相关数据库连接没有关闭的情况下, 数据库和驱动可以优化PreperedStatement
package five.base;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import four.utils.utilsSingle;
public class Base {
public static void main(String[] args) throws SQLException {
// 注入
read("'or 1 or '");
}
static void read(String name) throws SQLException{
Statement statement = null;
ResultSet rs = null;
utilsSingle instance = utilsSingle.getUtilsSingleInstance();
// 1 创建连接
Connection connection = instance.getConnection();
try {
// 2 创建语句
statement = connection.createStatement();
// 4 执行语句
String sql = "select *from user where name = '" + name + "'";
System.out.println(sql);
rs = statement.executeQuery(sql);
// 5 处理结果
while (rs.next()) {
System.out.println(rs.getObject(1)
+ "/t" + rs.getObject(2)
+ "/t" + rs.getObject(3)
+ "/t" + rs.getObject(4)
+ "/t");
}
} finally {
// 释放资源 finally
instance.free(connection, statement, rs);
}
}
}
解决思路 过滤 sql 保留字
但是 不同的数据库 的某些保留字 是不一样的
例如 单引号 双引号
所以 应该交给数据库生产厂商(驱动)来过滤保留字