MySQL的预编译语句的转义探究

0x00 什么是预编译语句

SQL语句,说到底也是一种类似于编程语言的东西,目的是让程序员更友好的操纵数据库,既然这样,它肯定也存在一个SQL语句的编译过程,将其转化为数据库所能执行的命令。顾名思义,预编译语句就是将需要执行SQL语句预先进行编译后缓存起来,下次使用的时候直接越过了编译这步,理论上是会比普通的SQL查询拥有更好的性能。我这里的重点不是关注它的性能,而是大家都说,预编译可以防止SQL注入,事实是怎样的呢?我们平时说的参数化查询,又是怎么一回事?

0x01 搭建环境

我们需要了解应用程序和数据库交互时,一些支持预编译的模块(如PreparedStatement)进行了怎样的处理,数据库收到的究竟是怎样的数据。我们通过两种方式来观察传递结果:开启MySQL的日志记录用wireshark抓包

首先,打开MySQL的日志记录:
这里遇到了一点小坑,寻找my.ini配置文件的时候,以为位置是在默认安装根目录下(C:\Program Files\MySQL\MySQL Server 5.7),结果发现并没有。查看文档,说依照以下顺序搜索配置文件:

%PROGRAMDATA%\MySQL\MySQL Server 5.7\my.ini
%PROGRAMDATA%\MySQL\MySQL Server 5.7\my.cnf
%WINDIR%\my.ini
%WINDIR%\my.cnf
C:\my.ini
C:\my.cnf
......

我在cmd里 echo %PROGRAMDATA%,结果输出的是:

这里写图片描述

接下来找到my.ini ,在 [mysqld]中修改以下两个参数:

...
general-log=1   # 默认是0,1代表开启
general_log_file="E:/mysql/logs/mysql_general.log"
...

接下来我们新建一个简单的Java程序,来测试一下:

try {
       Class.forName(name);//指定连接类型
       conn = DriverManager.getConnection(url, user, password);//获取连接
       pst = conn.prepareStatement("SELECT * FROM users WHERE `name`=?");//准备执行语句
       pst.setString(
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值