MyBatis

作者: 技术灭霸 | 来源:发表于2020-05-15 23:39 被阅读0次

    数据库预编译为什么能防止SQL注入呢?

    所谓SQL注入,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力。

    因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1’也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了SQL注入的作用了!

    如果我们想防止SQL注入,理所当然地要在输入参数上下功夫。上面代码中黄色高亮即输入参数在SQL中拼接的部分,传入参数后,打印出执行的SQL语句,会看到SQL是这样的:

    SELECT id,title,author,content FROM blog WHERE id = ?
    

    不管输入什么参数,打印出的SQL都是这样的。这是因为MyBatis启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。

    相关文章

      网友评论

          本文标题:MyBatis

          本文链接:https://www.haomeiwen.com/subject/ftjkohtx.html