一、什么是预处理 ?
对sql语句进行预编译以达到防止SQL注入的同时操作数据库时提高执行速度。
二、防止SQL注入
1、什么是SQL注入
SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一;
SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行;
2、SQL注入类型
1、数字型注入
String id = "1 or 1=1 ";
String sql = "select * from table where id = " + id;
String newsql = "select * from table where id =1 or 1=1";
2、字符型注入
String name = "'y' or 'y'='y' ";
String sql = "select * from table where name = " + name;
String newsql = "select * from table where name = 'y' or 'y'='y'";
3、模糊查询注入
String name = "'%y%' or '%y%'='%y%'";
String sql = "select * from table where name like " + name;
String newsql = "select * from table where name = '%y%' or '%y%'='%y%'";
3、使用预处理预防sql注入
使用PreparedStatement进行预处理
Connection conn = dataSource.getConnection();
String sql = "select * from table where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setint(1,001);
ps.executeQuery();
(1)编写好sql语句后使用PreparedStatement将sql语句格式固定。
(2)使用set方法为固定好的sql语句添加参数
(3)执行代码
JDBC在处理SQL语句时有一个预编译的过程,而预编译对象就是把一些格式固定的SQL编译后,存放在内存池中即JDBC缓冲池,当我们再次执行相同的SQL语句时就不需要预编译的过程了,所以即使SQL注入特殊的语句,也会只当做参数传进去,不会当做指令执行。
三、为什么预处理能提高
1、原理
SQL语句在代码运行前,已经进行了预编译。在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,然后对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询。
如同各地的加盟店一样,若是所有购买的商品都直接从总部发货势必会大大加强总部的压力,而如果有了加盟店,货物就近由加盟店发货,从而达到减轻总部压力,大大加快速度。