前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在php中使用PDO预防sql注入

在php中使用PDO预防sql注入

作者头像
yumusb
发布2020-04-22 10:18:48
1.2K0
发布2020-04-22 10:18:48
举报
文章被收录于专栏:坏男孩

在建站中,注入(Injection)一直都是一个值得考虑的安全问题,在OWASP(Open Web Application Security Project) TOP 10 中位列第一。详见OWASP官网https://www.owasp.org/

当然我们要考虑的不是怎么去注入,而是怎么去防止注入(此处以php+MySQL作例)

  1. 对参数进行安全化处理。最常见的应该就是过滤了,但是过滤规则容易遗漏,就不多探讨了。其次,整数化参数应该也是一种简洁的方案。再还有一些自带的函数,例如addslashes()等。
  2. PDO预处理,也就是这篇文章的主角。安装可以查看文档https://www.php.net/manual/zh/pdo.installation.php PDO同时也支持其他的数据库类型,这也极大的简化了php中原有的与数据库交互的形式。
代码语言:javascript
复制
<?php
	header("Content-Type: text/html;charset:utf-8");
	$host = 'localhost'; //数据库地址
	$port = 3306; //端口
	$user = 'root'; //用户名
	$pwd = 'root'; //密码
	$dbname = 'test'; //库名称
	$db = new PDO("mysql:dbname={$dbname};host={$host};port={$port}",$user, $pwd,array(PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8"));

按照以上的代码,我们就实例化了一个PDO对象,最后一个参数是为了防止查询过程中乱码。 之所以造成sql注入的原因,是因为用户恶意对我们的SQL语句进行拼接,而PDO中的prepare方法则解决了这个问题。处理数据也就是 增删改查,实例如下:

代码语言:javascript
复制
	//查
	$wd = '%'.$_GET['wd'].'%';
	$tmp = $db->prepare("SELECT * FROM `university` where `name` like ? limit 10");
	//先prepare一下我们需要执行的SQL语句,其中需要安全处理的参数是以`?`占位的
    $tmp->execute(array($wd));
    //执行prepare的execute方法,并把参数以数组方式传入
    $res = $tmp->fetchAll(PDO::FETCH_ASSOC);
    //PDO::FETCH_ASSOC参数是为了只返回对应的列的数据,如果没有这个参数的话,返回的数据会增加上以0开头排列的数据
    //fetchAll()直接返回查询到的所有数据,fetch()每次调用返回查询到的一条数据
    echo json_encode($res);//JSON化输出查询的结果
	//增删改
	$tmp = $db->prepare("UPDATE `university` SET `name`='北大' WHERE `name` = ?");
    //先prepare一下我们需要执行的SQL语句,其中需要安全处理的参数是以`?`占位的
    $tmp->execute(array("北京大学"));
    echo $tmp->rowCount();//返回影响的行数    

×由于上边这个实例是使用LIKE查询,所以就需要先把%包裹在参数两侧。 当然除了安全化的这种处理,PDO也是可以执行普通的语句的。

代码语言:javascript
复制
//查
$sql = "SELECT * FROM `university` where `name` like '%北京%' limit 10";
$data=$db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($data);
//增删改
$sql = "UPDATE `university` SET `name`='北大' WHERE `name` ='北京大学'";
$data=$db->exec($sql);//data保存的是执行SQL影响的行数
echo $data;

以上就是PDO的基本用法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档