当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-04 23:39:54 浏览: 评论:0 

这篇文章主要介绍了PHP简单实现防止SQL注入的方法,结合实例形式分析了php防止SQL注入的常用操作技巧与注意事项,代码备有详尽注释便于理解,需要的朋友可以参考下。

本文实例讲述了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. ?> 

方法二: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. }

Tags: PHP防止SQL注入

分享到: