SQL预编译
MySQL :: MySQL 8.0 Reference Manual :: 13.5 Prepared Statements https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html
预编译语句(Prepared Statements)介绍,以MySQL为例 - 活在夢裡 - 博客园 https://www.cnblogs.com/micrari/p/7112781.html
SQL预编译 - 简书 https://www.jianshu.com/p/9972d7b33061
4.1.8. 预编译 — Web安全学习笔记 1.0 文档 https://websec.readthedocs.io/zh/latest/vuln/sql/precompile.html
4.1.8. 预编译
4.1.8.1. 简介
SQL注入是因为解释器将传入的数据当成命令执行而导致的,预编译是用于解决这个问题的一种方法。和普通的执行流程不同,预编译将一次查询通过两次交互完成,第一次交互发送查询语句的模板,由后端的SQL引擎进行解析为AST或Opcode,第二次交互发送数据,代入AST或Opcode中执行。因为此时语法解析已经完成,所以不会再出现混淆数据和代码的过程。
4.1.8.2. 模拟预编译
为了防止低版本数据库不支持预编译的情况,模拟预编译会在客户端内部模拟参数绑定的过程,进行自定义的转义。
4.1.8.3. 绕过
4.1.8.3.1. 预编译使用错误
预编译只是使用占位符替代的字段值的部分,如果第一次交互传入的命令使用了字符串拼接,使得命令是攻击者可控的,那么预编译不会生效。
4.1.8.3.2. 部分参数不可预编译
在有的情况下,数据库处理引擎会检查数据表和数据列是否存在,因此数据表名和列名不能被占位符所替代。这种情况下如果表名和列名可控,则可能引入漏洞。
4.1.8.3.3. 预编译实现错误
部分语言引擎在实现上存在一定问题,可能会存在绕过漏洞。