码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 学习笔记-关于PDO的一些事


    PDO主要是这个选项

    PDO::ATTR_EMULATE_PREPARES => false

    image-20220622131618003

    image-20220622131618003

    这个选项涉及到PDO的”预处理”机制:因为不是所有数据库驱动都支持SQL预编译,所以PDO存在”模拟预处理机制”。如果说开启了模拟预处理,那么PDO内部会模拟参数绑定的过程,SQL语句是在最后execute()的时候才发送给数据库执行;如果我这里设置了PDO::ATTR_EMULATE_PREPARES => false,那么PDO不会模拟预处理,参数化绑定的整个过程都是和Mysql交互进行的。

    非模拟预处理的情况下,参数化绑定过程分两步:第一步是prepare阶段,发送带有占位符的sql语句到mysql服务器(parsing->resolution),第二步是通过execute()函数多次发送占位符参数给mysql服务器进行执行(多次执行optimization->execution)。

    这时,假设在第一步执行prepare($SQL)的时候我的SQL语句就出现错误了,那么就会直接由mysql那边抛出异常,不会再执行第二步。(From phith0n)

    PDO默认支持多语句查询,如果php版本小于5.5.21或者创建PDO实例时未设置PDO::MYSQL_ATTR_MULTI_STATEMENTS为false时可能会造成堆叠注入(From haby0)

    image-20220622101510813

    image-20220622101510813

    翻译过来就是当它设置为False时PDO::prepare() 和 PDO::query() 就会禁用多查询,

    PDO的配置放在实例化时的第四个参数位置,类型为数组。

    new PDO($dsn, $user, $pass, array( PDO::MYSQL_ATTR_MULTI_STATEMENTS => false))

    PS:有个小问题,非模拟预处理下PDO::prepare()才会和数据库交互,而非模拟预处理是不存在堆叠注入可能性的,官方手册里却还写上了这是为啥?感觉这里应该写成PDO::execute()才对。

    总结

    • 并不是说使用了PDO就是安全的
    • pdo的模拟预处理和非模拟预处理
      • 模拟预处理:在PDO内部模拟参数绑定的过程。PDO::ATTR_EMULATE_PREPARES => true
      • 非模拟预处理:参数化绑定的整个过程都与数据库交互,就是交给数据库去预编译,PDO::ATTR_EMULATE_PREPARES => false
      • 认为可以理解为模拟预处理和预处理….
    • 可控变量直接拼接的前提下:
      • 模拟预处理下,execute阶段会造成注入,可以使用堆叠注入
      • 非模拟预处理下,不存在堆叠注入,会在prepare阶段报错,但还可以用其他注入类型(毕竟是直接拼接了)。
      • 比如既然会在prepare阶段报错,那么理所应当可以使用报错注入,但是要回显错误信息的话还需要设置PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    • 综上再copy一下haby0给的安全建议:
      • 使用PDO时尽量使用非模拟预处理
      • PDO最好配置PDO::MYSQL_ATTR_MULTI_STATEMENTS => false,禁止多语句查询(默认是true)
      • 不要直接拼接可控变量,占位符多好啊

    案例的话,去看提到的两位师傅的文章吧。

    点击关注,共同学习!
    [安全狗的自我修养](https://mp.weixin.qq.com/s/E6Kp0fd7_I3VY5dOGtlD4w)


    [github haidragon](https://github.com/haidragon)


    https://github.com/haidragon

  • 相关阅读:
    神经网络与机器学习 - 第0章 导言
    数值分析学习笔记——绪论【华科B站教程版本】
    【六十七】【算法分析与设计】[HNOI2003]操作系统,优先队列,自定义比较方式,模拟,提高输入输出效率之神奇小代码,初始化小技巧
    HTML<var> 标签
    互联网电商大厂库存系统设计案例讲解
    JavaScript 循环遍历对象案例
    大数据-之LibrA数据库系统告警处理(ALM-12047 网络读包错误率超过阈值)
    一款超好用的神器Apifox,甩 Swagger 几条街...(荣耀典藏版)
    [NOI2016] 优秀的拆分 题解
    [架构之路-228]:计算机硬件与体系结构 - 硬盘存储结构原理:如何表征0和1,即如何存储0和1,如何读数据,如何写数据(修改数据)
  • 原文地址:https://blog.csdn.net/sinat_35360663/article/details/127773096
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号