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


Posted in PHP onMarch 13, 2018

本文实例讲述了PHP简单实现防止SQL注入的方法。分享给大家供大家参考,具体如下:

方法一:execute代入参数

<?php
if(count($_POST)!= 0) {
  $host = 'aaa';
  $database = 'bbb';
  $username = 'ccc';
  $password = '***';
  $num = 0;
  $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);//创建一个pdo对象
  foreach ($_POST as $var_Key => $var_Value) {
    //获取POST数组最大值
    $num = $num + 1;
  }
  //下标为i的数组存储的是商品id, 下标为j数组的存储的是此商品的库存
  for($i=0;$i<$num;$i=$i+2)
  {
    //库存下标
    $j = $i+1;
    //判断传递过来的数据合法性
    if(is_numeric(trim($_POST[$i])) && is_numeric(trim($_POST[$j]))){
      //禁用prepared statements的仿真效果
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      //查询数据库中是否存在该ID的商品
      //当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据
      $stmt = $pdo->prepare("select good_id from delphi_test_content WHERE good_id = ?");
      //当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。
      $stmt->execute(array($_POST[$i]));
      //返回查询结果
      $count = $stmt->rowCount();
      //如果本地数据库存在该商品ID和库存记录,就更新该商品的库存
      if($count != 0)
      {
        $stmt = $pdo->prepare("update delphi_test_content set content = ? WHERE good_id = ?");
        $stmt->execute(array($_POST[$j], $_POST[$i]));
      }
      //如果本地数据库没有该商品ID和库存记录,就新增该条记录
      if($count == 0)
      {
        $stmt = $pdo->prepare("insert into delphi_test_content (good_id,content) values (?,?)");
        $stmt->execute(array($_POST[$i], $_POST[$j]));
      }
    }
  }
  $pdo = null;
  //关闭连接
}
?>

方法二:bindParam绑定参数

<?php
if(count($_POST)!= 0) {
  $host = 'aaa';
  $database = 'bbb';
  $username = 'ccc';
  $password = '***';
  $num = 0;
  $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);//创建一个pdo对象
  foreach ($_POST as $var_Key => $var_Value) {
    //获取POST数组最大值
    $num = $num + 1;
  }
  //下标为i的数组存储的是商品id, 下标为j数组的存储的是此商品的库存
  for($i=0;$i<$num;$i=$i+2)
  {
    //库存下标
    $j = $i+1;
    //判断传递过来的数据合法性(此数据为商品编号以及库存,严格来说字符串全是由数字组成的)
    if(is_numeric(trim($_POST[$i])) && is_numeric(trim($_POST[$j]))){
      //查询数据库中是否存在该ID的商品
      $stmt = $pdo->prepare("select good_id from delphi_test_content WHERE good_id = ?");
      $stmt->execute(array($_POST[$i]));
      $stmt->bindParam(1,$_POST[$i]);
      $stmt->execute();
      //返回查询结果
      $count = $stmt->rowCount();
      //如果本地数据库存在该商品ID和库存记录,就更新该商品的库存
      if($count != 0)
      {
        $stmt = $pdo->prepare("update delphi_test_content set content = ? WHERE good_id = ?");
        $stmt->execute(array($_POST[$j], $_POST[$i]));
        $stmt->bindParam(1,$_POST[$j]);
        $stmt->bindParam(2,$_POST[$i]);
        $stmt->execute();
      }
      //如果本地数据库没有该商品ID和库存记录,就新增该条记录
      if($count == 0)
      {
        $stmt = $pdo->prepare("insert into delphi_test_content (good_id,content) values (?,?)");
        $stmt->bindParam(1,$_POST[$i]);
        $stmt->bindParam(2,$_POST[$j]);
        $stmt->execute();
      }
    }
  }
  $pdo = null;
  //关闭连接
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
JAVA/JSP学习系列之六
Oct 09 PHP
在Windows中安装Apache2和PHP4的权威指南
Oct 09 PHP
source.php查看源文件
Dec 09 PHP
木翼下载系统中说明的PHP安全配置方法
Jun 16 PHP
PHP生成Flash动画的实现代码
Mar 12 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
php输出表格的实现代码(修正版)
Dec 29 PHP
php入门学习知识点二 PHP简单的分页过程与原理
Jul 14 PHP
php对数组排序代码分享
Feb 24 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
PHP单元测试配置与使用方法详解
Dec 27 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 #PHP
PHP实现的简单路由和类自动加载功能
Mar 13 #PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 #PHP
php把字符串指定字符分割成数组的方法
Mar 12 #PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 #PHP
php取出数组单个值的方法
Mar 12 #PHP
php合并数组并保留键值的实现方法
Mar 12 #PHP
You might like
PHP实现网上点歌(二)
2006/10/09 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
深入php list()函数的详解
2013/06/05 PHP
php缓存技术详细总结
2013/08/07 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
python基础教程之缩进介绍
2014/08/29 Python
初步讲解Python中的元组概念
2015/05/21 Python
python算法演练_One Rule 算法(详解)
2017/05/17 Python
Python 多线程的实例详解
2017/09/07 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
django使用多个数据库的方法实例
2021/03/04 Python
介绍一下Python中webbrowser的用法
2013/05/07 面试题
技术总监个人的自我评价范文
2013/12/18 职场文书
运动会通讯稿150字
2014/02/15 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
交通安全教育主题班会
2015/08/12 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
python实现简单的聊天小程序
2021/07/07 Python
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers