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将向Java靠拢
Oct 09 PHP
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
php 时间计算问题小结
Jan 04 PHP
PHP GD 图像处理组件的常用函数总结
Apr 28 PHP
解析isset与is_null的区别
Aug 09 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
PHP遍历数组的方法汇总
Apr 30 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 PHP
PHP自动载入类文件函数__autoload的使用方法
Mar 25 PHP
php实现的顺序线性表示例
May 04 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 模拟登陆MSN并获得用户信息
2009/05/16 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
php删除指定目录的方法
2015/04/03 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
利用Javascript开发一个二维周视图日历
2017/12/14 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python实现大文件排序的方法
2015/07/10 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
详解Python 切片语法
2019/06/10 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
Python3的socket使用方法详解
2020/02/18 Python
pandas分组聚合详解
2020/04/10 Python
python的json包位置及用法总结
2020/06/21 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
厂长助理岗位职责
2013/12/27 职场文书
学校消防演习方案
2014/02/19 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
医院消毒隔离制度
2015/08/05 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫