1. pdo预处理机制在防sql注入的作用?

$sql = “select from users where username=’{$user}’ and password=’{$pwd}’”
假定用户输入的帐号为’ or 1=1 #及密码任意
PDO会拼接字符串结果如下:
“select
from users where username=’’ or 1=1 #’ and password=’qetad’”
条件被修改为username=’’ or 1=1这个结果为真, 密码被#注释了,导致无需用户名和密码就能通过执行.

  1. $dsn = "mysql:host=127.0.0.1;dbname=user;";
  2. $username = "root";
  3. $password = "root123";
  4. $pdo = new PDO($dsn, $username, $password);
  5. //假定用户输入的帐号为' or 1=1 #及密码任意
  6. $user = "' or 1=1 #";
  7. $pwd = "qetad";
  8. $sql = "select * from `users` where `username`='{$user}' and `password`='{$pwd}'";
  9. //rowCount影响行数
  10. echo $stmt->rowCount(); //输出 104

当使用prepare时,prepare语句服务器发送一条sql给mysql服务器,mysql服务器会解析这条sql。
excute语句会把绑定的参数当做纯参数赋值给prepare。哪怕参数中有sql命令也不会被执行,从而实现防治sql注入。

  1. $dsn = "mysql:host=127.0.0.1;dbname=user;";
  2. $username = "root";
  3. $password = "root123";
  4. $pdo = new PDO($dsn, $username, $password);
  5. //假定用户输入的帐号为' or 1=1 #及密码任意
  6. $user = "' or 1=1 #";
  7. $pwd = "qetad";
  8. $sql = "select * from `users` where `username`=:user and `password`=:pwd";
  9. //使用prepare
  10. $stmt = $pdo->prepare($sql);
  11. $stmt->bindParam('user',$user);
  12. $stmt->bindParam('pwd', $pwd);
  13. $stmt->execute();
  14. //rowCount影响行数
  15. echo $stmt->rowCount(); // 0

2. pdo curd预处理? 扩展:pdo 预处理中bindValue与bindParam的不同之处有哪些?

  • bindValue
    PDOStatement::bindValue ($param, $value, $type = PDO::PARAM_STR) bool
    绑定一个值到用作预处理的 SQL 语句中的对应命名占位符或问号占位符

  • bindParam
    PDOStatement::bindParam ($param, &$var, $type = PDO::PARAM_STR, $maxLength = null, $driverOptions = null) bool
    绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或问号占位符。 不同于 PDOStatement::bindValue() ,此变量作为引用被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值。
    bindParam不能绑定具体的数值.

  1. $dsn = "mysql:host=127.0.0.1;dbname=user;";
  2. $username = "root";
  3. $password = "root123";
  4. $pdo = new PDO($dsn, $username, $password);
  5. // 使用问号点位符
  6. $sql1 = "select * from `users` where `id`=:id";
  7. $stmt1 = $pdo->prepare($sql1);
  8. $id = 1;
  9. $stmt1->bindValue('id',$id);
  10. $stmt1->bindParam('id',$id);
  11. $stmt1->execute();
  12. // 使用命名点位符
  13. $sql2 = "select * from `users` where `id`=?";
  14. $stmt2 = $pdo->prepare($sql1);
  15. $stmt2->bindValue(1,1);
  16. $stmt2->bindParam(1,1); //报错
  17. $stmt2->execute();

更多相关文章

  1. 3.分治算法的设计思想与分析方法: 芯片测试, 快速排序, 幂乘算法
  2. 格式化输出的三种方式
  3. 内嵌Xilinx FPGA,由VisualApllet编程实现颠覆性嵌入式机器视觉系
  4. 数据预处理的简单案例分析
  5. VS经常提示函数不安全(报错、报警告),该怎么解决?
  6. 流程图控件GoJS类别索引之类装饰
  7. pdo操作
  8. uniapp获取并修改原生搜索框的占位内容
  9. 数据库CURD|常用的select查询|预处理

随机推荐

  1. android 关于tts的一些参数
  2. android原生项目整合ReactNative
  3. 搭建android测试环境
  4. android sdk setup时出现:HTTPS SSL erro
  5. Android-Accessibility(Android(安卓)8.0
  6. Android中三星调用系统相机拍照后旋转的
  7. Android(安卓)各版本代号 & Java Source
  8. android webview 遇到android.os.FileUri
  9. Android属性动画property animation
  10. Android开发者实用代码片段