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导出oracle库的php代码
Apr 20 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
PHP获取数组中重复最多的元素的实现方法
Nov 11 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
php中fsockopen用法实例
Jan 05 PHP
帝国cms目录结构分享
Jul 06 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
YII框架常用技巧总结
Apr 27 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
vue.js实现照片放大功能
2020/06/23 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
Python中atexit模块的基本使用示例
2015/07/08 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
浅谈Python中的私有变量
2018/02/28 Python
关于python写入文件自动换行的问题
2018/06/23 Python
python3.7.0的安装步骤
2018/08/27 Python
Python Cookie 读取和保存方法
2018/12/28 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
Canvas图片分割效果的实现
2019/07/29 HTML / CSS
怎样比较两个类型为String的字符串
2016/08/17 面试题
单位在职证明范本
2014/01/09 职场文书
市场营销工作计划书
2014/05/06 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
服务口号大全
2014/06/11 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
报到证办理个人委托书
2014/10/06 职场文书
离婚协议书范本2014
2014/10/27 职场文书
退货证明模板
2015/06/23 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书