什么是预编译,为什么预编译能防止SQL注入?

一、什么是预编译?

预编译是做些代码文本的替换工作。是整个编译过程的最先做的工作

什么是预编译,为什么预编译能防止SQL注入?

 通过上面的解释可能还是不太理解预编译,通俗简单的说在程序真正执行一段代码之前,我们对要执行的代码做一些特定的处理,来达到我们后期所想要达到的一个效果

二、为什么预编译能防止SQL注入?

在知道为什么预编译能防止SQL注入时,我们先来看一个例子:

使用sql拼接:"select * from user where username = ' " + username + " ' ";

页面上可能会有个输入框:用户名:________________________

如果有人这么填:用户名:___hello'; delete from user where id='1__最终的Sql就是 "select * from user where username = 'hello'; delete from user where id='1' ";

Sql注入就发生了,不仅仅会返回你想要的用户信息,还会删除id为1的用户;与代码预期的逻辑不一致

使用prepareStatement
Sql发送到服务器大致会有如下流程:

什么是预编译,为什么预编译能防止SQL注入?

  1. 解析阶段
  2. 编译阶段
  3. 优化阶段
  4. 缓存阶段
  5. 执行阶段

PrepareStatement发送到服务器后会经历上述1、2、3、4过程,PrepareStatement并不是完整的sql语句,在执行之前还需要进行用户数据替换。在填入用户数据时,PrepareStatement已经经历了上述过程,就不会重新编译,用户的数据只能作为数据进行填充,而不是sql的一部分。服务器从缓存中获得已经编译优化后的语句,替换掉用户数据执行,避免了sql注入