标签:注入 一个 编译优化 获得 rest 需要 name ima 语句
一、什么是预编译?
预编译是做些代码文本的替换工作。是整个编译过程的最先做的工作
通过上面的解释可能还是不太理解预编译,通俗简单的说在程序真正执行一段代码之前,我们对要执行的代码做一些特定的处理,来达到我们后期所想要达到的一个效果
二、为什么预编译能防止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发送到服务器大致会有如下流程:
PrepareStatement发送到服务器后会经历上述1、2、3、4过程,PrepareStatement并不是完整的sql语句,在执行之前还需要进行用户数据替换。在填入用户数据时,PrepareStatement已经经历了上述过程,就不会重新编译,用户的数据只能作为数据进行填充,而不是sql的一部分。服务器从缓存中获得已经编译优化后的语句,替换掉用户数据执行,避免了sql注入
标签:注入 一个 编译优化 获得 rest 需要 name ima 语句
原文地址:https://www.cnblogs.com/qxwucaifei/p/14315857.html