• 售前

  • 售后

热门帖子
入门百科

PHP简单实现防止SQL注入的方法

[复制链接]
散粉的火把煌 显示全部楼层 发表于 2021-10-25 19:15:39 |阅读模式 打印 上一主题 下一主题
本文实例报告了PHP简单实现防止SQL注入的方法。分享给大家供大家参考,具体如下:
方法一:execute代入参数
  1. <?php
  2. if(count($_POST)!= 0) {
  3.   $host = 'aaa';
  4.   $database = 'bbb';
  5.   $username = 'ccc';
  6.   $password = '***';
  7.   $num = 0;
  8.   $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);//创建一个pdo对象
  9.   foreach ($_POST as $var_Key => $var_Value) {
  10.     //获取POST数组最大值
  11.     $num = $num + 1;
  12.   }
  13.   //下标为i的数组存储的是商品id, 下标为j数组的存储的是此商品的库存
  14.   for($i=0;$i<$num;$i=$i+2)
  15.   {
  16.     //库存下标
  17.     $j = $i+1;
  18.     //判断传递过来的数据合法性
  19.     if(is_numeric(trim($_POST[$i])) && is_numeric(trim($_POST[$j]))){
  20.       //禁用prepared statements的仿真效果
  21.       $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  22.       //查询数据库中是否存在该ID的商品
  23.       //当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据
  24.       $stmt = $pdo->prepare("select good_id from delphi_test_content WHERE good_id = ?");
  25.       //当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。
  26.       $stmt->execute(array($_POST[$i]));
  27.       //返回查询结果
  28.       $count = $stmt->rowCount();
  29.       //如果本地数据库存在该商品ID和库存记录,就更新该商品的库存
  30.       if($count != 0)
  31.       {
  32.         $stmt = $pdo->prepare("update delphi_test_content set content = ? WHERE good_id = ?");
  33.         $stmt->execute(array($_POST[$j], $_POST[$i]));
  34.       }
  35.       //如果本地数据库没有该商品ID和库存记录,就新增该条记录
  36.       if($count == 0)
  37.       {
  38.         $stmt = $pdo->prepare("insert into delphi_test_content (good_id,content) values (?,?)");
  39.         $stmt->execute(array($_POST[$i], $_POST[$j]));
  40.       }
  41.     }
  42.   }
  43.   $pdo = null;
  44.   //关闭连接
  45. }
  46. ?>
复制代码
方法二:bindParam绑定参数
  1. <?php
  2. if(count($_POST)!= 0) {
  3.   $host = 'aaa';
  4.   $database = 'bbb';
  5.   $username = 'ccc';
  6.   $password = '***';
  7.   $num = 0;
  8.   $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);//创建一个pdo对象
  9.   foreach ($_POST as $var_Key => $var_Value) {
  10.     //获取POST数组最大值
  11.     $num = $num + 1;
  12.   }
  13.   //下标为i的数组存储的是商品id, 下标为j数组的存储的是此商品的库存
  14.   for($i=0;$i<$num;$i=$i+2)
  15.   {
  16.     //库存下标
  17.     $j = $i+1;
  18.     //判断传递过来的数据合法性(此数据为商品编号以及库存,严格来说字符串全是由数字组成的)
  19.     if(is_numeric(trim($_POST[$i])) && is_numeric(trim($_POST[$j]))){
  20.       //查询数据库中是否存在该ID的商品
  21.       $stmt = $pdo->prepare("select good_id from delphi_test_content WHERE good_id = ?");
  22.       $stmt->execute(array($_POST[$i]));
  23.       $stmt->bindParam(1,$_POST[$i]);
  24.       $stmt->execute();
  25.       //返回查询结果
  26.       $count = $stmt->rowCount();
  27.       //如果本地数据库存在该商品ID和库存记录,就更新该商品的库存
  28.       if($count != 0)
  29.       {
  30.         $stmt = $pdo->prepare("update delphi_test_content set content = ? WHERE good_id = ?");
  31.         $stmt->execute(array($_POST[$j], $_POST[$i]));
  32.         $stmt->bindParam(1,$_POST[$j]);
  33.         $stmt->bindParam(2,$_POST[$i]);
  34.         $stmt->execute();
  35.       }
  36.       //如果本地数据库没有该商品ID和库存记录,就新增该条记录
  37.       if($count == 0)
  38.       {
  39.         $stmt = $pdo->prepare("insert into delphi_test_content (good_id,content) values (?,?)");
  40.         $stmt->bindParam(1,$_POST[$i]);
  41.         $stmt->bindParam(2,$_POST[$j]);
  42.         $stmt->execute();
  43.       }
  44.     }
  45.   }
  46.   $pdo = null;
  47.   //关闭连接
  48. }
  49. ?>
复制代码
更多关于PHP相关内容感兴趣的读者可检察本站专题:《php步伐设计安全教程》、《php安全过滤本领总结》、《PHP运算与运算符用法总结》、《PHP根本语法入门教程》、《php面向对象步伐设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作本领汇总》
盼望本文所述对大家PHP步伐设计有所帮助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作