pdo 防注入的原理 [猜想]

声明

来源我个人的猜想 ,仅供参考!!! 欢迎指正。

每个参数被''包涵

没有绑定的

pdo预防注入的原理猜想

预处理绑定

pdo预防注入的原理猜想

pdo预防注入的原理猜想

没有问题,因为id是数字。mysql只提取了前面的2做条件。

'转为\' (根本原因)

上面的想破坏很简单 传个'就好了。

没有绑定的

pdo预防注入的原理猜想

预处理绑定

pdo预防注入的原理猜想

pdo预防注入的原理猜想

总结

  1. mysql把每个参数都用''包围了
  2. 将有'的参数转化为\'

除非能让2失效,否则sql注入几乎不存在。

其他人的说法

pdo预防注入的原理猜想

哪怕参数中有sql命令也不会被执行,从而实现防治sql注入
我觉得是错误的说法。

个人对预处理的理解

预处理 绑定 执行
第一条sql走过这三个流程了,到第二条同样的sql绑定 执行 (只走两步)
后面依次如此。

预处理需要一点时间,比不绑定的慢(多个同样的命令就不一定了)。

预处理和防注入没有一点关系,只是pdo把参数处理了。

晚安~~

本作品采用《CC 协议》,转载必须注明作者和本文链接
专心学习不瞎搞
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

MySQL是支持原生的与处理的,只是在PHP模型层不同的框架封装的不一样而已,并且PDO处理的手段也不一样,其实底层,你可以使用MySQL的原生预处理,或者使用变量使用 引号的方式,都是可以的。至于你说的性能问题,如果是多次操作同样的SQL,只是不同的变量条件而已的话,那么预处理快很多,因为少了SQL上送的开销,以及SQL解析的开销等等。

4年前 评论

@LadyKiller

1.  
   $sql = 'select * from test where id ='.$id;
   $this->connection->query($sql);
2.
   $sql = 'select * from test where id = :id';  
   $sth = $this->connection->prepare($sql);
   $res = $sth->execute([':id' => $id]);

第2段为什么能防注入? 抓包后我发现这两段代码的处理差别 请看上面<<总结>>。

你前部分说的是pdo的封装, 我只是单纯讨论pdo为什么能防注入;

后部分我是认同的;

4年前 评论
白小二

手动处理数据跟pdo预处理差别其实是不大的,pdo发送预处理语句跟参数到MySQLserver,由mysqlserver进行编译拼接运行,能从根本上防注入,这是mysql提供的方法,要是不行,那就找MySQL开发者解决

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
87
粉丝
105
喜欢
480
收藏
717
排名:109
访问:8.7 万
私信
所有博文
社区赞助商