正在阅读:

为什么参数化查询可以防止SQL注入?

13,376

昨天被某大牛问了一个问题,为什么SQL参数化查询可以防止SQL注入,参数化查询的原理是什么? 结果闷逼了,之前只知道参数化查询是可以防止SQL注入,但是没有深究其原理,今天就找一些文章,学习一下,也分享给大家。

以下引用知乎大神们的回答:

预编译之所以能防止sql注入(我在这里只说sql注入这方面),还要从sql的执行方式有关。

一般来说,sql 是怎么执行的呢?简单说,一个sql 是经过解析器编译并执行,注意这里是一个并字。

举一个栗子,校验有没有这个用户的场景sql

select count(1) from students where name='张三'

上边的数据库执行时,是直接将这句话连带 name='张三',一起给编译了,然后执行。假设我的sql 注入语句是

select count(1) from students where name='张三' or '1=1'

即name 参数为张三‘ or '1=1 ,这个参数也会被编译器一同编译。

而使用预编译,数据库是怎么处理的呢?

这个步骤是在con.prepareStatement(“”)语句执行的时候,服务器就这个sql发送给了数据库,然后数据库将该sql编译后放入到缓存池中。等到服务器执行execute的时候,传给数据库的 张三' or '1=1 编译器并不进行编译,而是这找到原来的sql模板,传参,执行。所以, 张三‘ or '1=1 只会被数据库当做参数来处理。

简单总结,参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑,至于跑的时候是带一个普通背包还是一个怪物,不会影响行进路线,无非跑的快点与慢点的区别。

参考链接:

占位符,SQL注入?

参数化查询为什么可以防止SQL注入?

目前有:6条访客评论,博主回复2

  1. lz
    2018-03-23 19:08

    在学渗透。不过很多不懂。能大神交流下不。15879440889 微信

  2. 小白
    2018-03-25 10:29

    朋友好难呀,我渗透学了1月了,能有比较好的视频教程不,介绍一下,微信15879440889

    • 独自等待
      2018-03-26 10:24

      兄弟,网上搜索吧,视频还是比较多的。先学会搜索引擎语法

  3. 熊本本
    2018-03-27 11:57

    懂了 谢谢分享

  4. 山下小豆荚

    大神们,求有SQL注入漏洞的网址,我找了两天没找到😂😂

  5. 123
    2018-08-29 14:17

    送达时间

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌