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 相关文章推荐
细谈php中SQL注入攻击与XSS攻击
Jun 10 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
Aug 31 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
php汉字转拼音的示例
Feb 27 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
php实现window平台的checkdnsrr函数
May 27 PHP
完美的php分页类
Oct 24 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
使用PHP访问RabbitMQ消息队列的方法示例
Jun 06 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
PHP simplexml_load_string()函数实例讲解
Feb 03 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 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用身份证号获取星座和生肖的方法
2013/11/07 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
PHP分享图片的生成方法
2018/04/25 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
python中的__slots__使用示例
2015/02/26 Python
Python调用C++程序的方法详解
2017/01/24 Python
python实现简易数码时钟
2021/02/19 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
python交互模式基础知识点学习
2020/06/18 Python
django教程如何自学
2020/07/31 Python
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
构造器Constructor是否可被override?
2013/08/06 面试题
受欢迎的大学生自我评价
2013/12/05 职场文书
创业计划书的主要内容有哪些
2014/01/29 职场文书
经典演讲稿开场白
2014/08/25 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
导游词之神仙居景区
2019/11/15 职场文书