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网站提速三大“软”招
Oct 09 PHP
PHP 变量的定义方法
Jan 26 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
PHP设计模式之装饰者模式
Feb 29 PHP
php中strtotime函数用法详解
Nov 15 PHP
10款实用的PHP开源工具
Oct 23 PHP
使用Composer安装Yii框架的方法
Mar 15 PHP
PHPExcel简单读取excel文件示例
May 26 PHP
PHP is_array() 检测变量是否是数组的实现方法
Jun 13 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 PHP
基于PHP+mysql实现新闻发布系统的开发
Aug 06 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中$this-&amp;gt;含义分析
2009/11/29 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
基于jquery的Repeater实现代码
2010/07/17 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
Python设计模式之抽象工厂模式
2016/08/25 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python距离测量的方法
2018/03/06 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
纽约家具、家居装饰和地毯店:ABC Carpet & Home
2017/06/21 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
电大学习个人自我评价范文
2013/10/04 职场文书
如何填写个人简历自我评价
2013/12/10 职场文书
入学生会自荐书范文
2014/02/05 职场文书
表决心的诗句大全
2014/03/11 职场文书
国培计划培训感言
2014/03/11 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
导游词之长城八达岭
2019/09/24 职场文书
Python源码解析之List
2021/05/21 Python
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
Nginx反向代理、重定向
2022/04/13 Servers