【网络安全一百问-67】SQL预编译可以防御SQL注入攻击的原理是什么?有什么局限性?

请先 登录 后评论

2 个回答

kikihkm

在MySQL中,一条SQL语句从传入到执行经历了以下过程:检查缓存、规则验证、解析器解析为语法树、预处理器进一步验证语法树、优化SQL、生成执行计划、执行。其中对语法的解析和优化的过程其实是与传入的字段值无关的,但却比真正执行的过程更为耗费时间,因此在处理某些语句时,很容易造成时间的浪费,效率的下降。

所谓的预编译sql语句就是将这一类sql语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化,一般称这类语句叫Prepared Statements。

预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入。


局限性:并不是所有参数都可预编译,ORDER BY后的ASC/DESC不能被预编译,当业务场景涉及到用户可控制排序方式,且ASC/DESC是由前台传入并拼接到SQL语句上时,就可能出现危险了。

请先 登录 后评论
u52663873380211

预编译就是做一些代码文本的替换工作,是整个编译过程最先做的事情,编译方式能防范sql注入的原理是:在sql参数未注入之前,提前对sql语句进行预编译,后面注入的参数将不会再进行sql编译。即后面注入进来的参数系统将不会认为它会是一条SQL语句,而默认其是一个参数。由此就知道为什么预编译可以防止sql注入了。


请先 登录 后评论

相似问题