加载中...

SQL预处理


SQL预处理

这边建议你有了SQL的基础,再来读这篇文章。

1 原理

即时 SQL
一条 SQL 直接是走流程处理,一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL),具体如下

词法和语义解析;
优化 SQL 语句,制定执行计划;
执行并返回结果;
但是,在绝大多数情况下,如果需求某一条 SQL 语句被反复调用执行,或者每次执行的时候只有个别的值不同。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显降低了许多。这个时候就需要预处理sql

预处理SQL
预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。 MySQL 预处理语句的支持版本较早,所以我们目前普遍使用的 MySQL 版本都是支持这一语法的。

2 利用

MySQL 官方将 prepare、execute、deallocate 统称为 PREPARE STATEMENT。翻译也就习惯的称其为预处理语句

其实这主要是和concat函数在堆叠注入用在一起当做一种SQL注入的利用姿势!(我的理解)

当然了,预处理可以和char函数,16进制等等方式来结合!

1
2
3
4
PREPARE name from '[my sql sequece]';   //预定义SQL语句()
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL 语句
要使用变量的地方 用?表示
1 用于字符串的拼接操作

​ 例如下面的语句

1
username=1';set @sql=concat('up','date `score` set listen=123 where username="火华"');prepare sql_exe FROM @sql;execute sql_exe#       还是newstarctf的一道题为例子

由于题目过滤了update,但我们却要使用,就只能采取这种预处理的方式。不然只能考虑换关键字,换方法了。

强网杯的随便注也可以用这种姿势。

​ 2 用来变量的定义替换

文章参考:MySQL的SQL预处理(Prepared) - GeaoZhang - 博客园 (cnblogs.com)


文章作者: Wuhen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Wuhen !
评论
  目录