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 相关文章推荐
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
windows7下安装php的imagick和imagemagick扩展教程
Jul 04 PHP
linux中cd命令使用详解
Jan 08 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
Dec 14 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
php微信公众平台开发(四)回复功能开发
Dec 06 PHP
PHP7 list() 函数修改
Mar 09 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php 数组的指针操作实现代码
2011/02/08 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
python 对xml解析的示例
2021/02/27 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
高中体育教学反思
2014/01/29 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
学习经验交流会策划书
2015/11/02 职场文书
MYSQL常用函数介绍
2022/05/05 MySQL