码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2021-01-25 11:00:51      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:注入   一个   编译优化   获得   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发送到服务器大致会有如下流程:

技术图片

 

 

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

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

 

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

标签:注入   一个   编译优化   获得   rest   需要   name   ima   语句   

原文地址:https://www.cnblogs.com/qxwucaifei/p/14315857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!