PHP防止sql注入小技巧之sql预处理原理与实现方法分析


Posted in PHP onDecember 13, 2019

本文实例讲述了PHP防止sql注入小技巧之sql预处理原理与实现方法。分享给大家供大家参考,具体如下:

我们可以把sql预处理看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。

我们来看下它有什么好处:

  • 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
  • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
  • 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。

这种预处理呢,可以通过两个方式,咱们这次要说的是mysqli。它任何时候都可以确保应用程序可以用相同的数据访问模式,比PDO要更加实用。

预处理呢,它有两种语句,一种是dml语句,另一种是dql语句。咱们先来看第一种:

<?php
header('Content-type:text/html;charset=utf-8');
$mysqli = new mysqli("127.0.0.1","root","root","test");
$mysqli->query('set names utf8');
$insert = $mysqli->prepare("insert admins (title,cookies,sta,lid) values (?,?,?,?)");
$title = "cuijinpeng";
$cookies = "luyaran201314";
$sta = "1";
$lid = 1;
$insert->bind_param("sssi",$title,$cookies,$sta,$lid);
$res = $insert->execute();
if($res){
  echo 1;
}else{
  echo $insert->error;
  echo 0;
}
$insert->close();
$mysqli->close();

第二种呢,代码如下:

<?php
header('Content-type:text/html;charset=utf-8');
$mysqli = new mysqli("127.0.0.1","root","root","test");
$mysqli->query('set names utf8');
$select = $mysqli->prepare("select id,title,cookies,sta,lid from admins where id > ?");
$id = "1";
$select->bind_param("i",$id);
$select->bind_result($id,$title,$cookies,$sta,$lid);
$select->execute();
while ($select->fetch()) {
  echo $id."---".$title."---".$cookies."---".$sta."---".$lid."<br>";
}
$select->close();
$mysqli->close();

接下来,咱们就该看下这两种语句分别支持什么样子的sql了。

第一种呢,它支持insert、update、delete这三种类型的sql,第二种嘞,就是查询语句了。

完事那个bind_param里的那个i,就是咱们传入参数的类型了,具体介绍如下:

  • i - integer(整型)
  • d - double(双精度浮点型)
  • s - string(字符串)
  • b - BLOB(binary large object:二进制大对象)

我们传入的每个参数都需要指定类,这样通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。

好啦,本次记录就到这里了。

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

PHP 相关文章推荐
PHP date函数参数详解
Nov 27 PHP
怎样才能成为PHP高手?学会“懒惰”的编程
Dec 05 PHP
PHP中常用数组处理方法实例分析
Aug 30 PHP
PHP 程序授权验证开发思路
Jul 09 PHP
php计算程序运行时间的简单例子分享
May 10 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
php中Snoopy类用法实例
Jun 19 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
Mar 10 PHP
php中各种定义变量的方法小结
Oct 18 PHP
PHP检测接口Traversable用法详解
Dec 29 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 #PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 #PHP
laravel通用化的CURD的实现
Dec 13 #PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 #PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 #PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 #PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 #PHP
You might like
十天学会php之第一天
2006/10/09 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
php生成zip文件类实例
2015/04/07 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
JS加ASP二级域名转向的代码
2007/05/17 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
对json字符串与python字符串的不同之处详解
2018/12/19 Python
Python创建字典的八种方式
2019/02/27 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
Python算法中的时间复杂度问题
2019/11/19 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
尼克松手表官网:Nixon手表
2019/03/17 全球购物
智能电子应届生求职信
2013/11/10 职场文书
公司培训欢迎词
2014/01/10 职场文书
安全大检查反思材料
2014/01/31 职场文书
校园安全检查制度
2014/02/03 职场文书
美术国培研修感言
2014/02/12 职场文书
超市活动计划书
2014/04/24 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
HTML基础详解(下)
2021/10/16 HTML / CSS