当 我们使用传统的 mysql_connect 、mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失 去控制。虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷。而使用PHP的PDO扩展 的 prepare 方法,就可以避免sql injection 风险。PDO(PHP Data Object) 是

PHP5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,

如 php_mysql.dll。 PHP6中也将默认使用PDO的方式连接,mysql扩展将被作为辅助 。官方:http://php.net/manual/en/book.pdo.php1、PDO配置 使

用PDO扩展之前,先要启用这个扩展,PHP.ini中,去掉"extension=php_pdo.dll"前面的";"号,若要连接数据库,还需要去

掉与PDO相关的数据库扩展前面的";"号(一般用的是php_pdo_mysql.dll),然后重启Apache服务器即可。

extension=php_pdo.dll

extension=php_pdo_mysql.dll

2、PDO连接mysql数据库

$dbh = new PDO("mysql:host=localhost;dbname=db_demo","root","password");

默认不是长连接,若要使用数据库长连接,需要在最后加如下参数:

$dbh = new PDO("mysql:host=localhost;dbname=db_demo","root","password","array(PDO::ATTR_PERSISTENT => true) ");

$dbh = null; //(释放)

3、PDO设置属性1) PDO有三种错误处理方式:• PDO::ERrmODE_SILENT不显示错误信息,只设置错误码• PDO::ERrmODE_WARNING显示警告错• PDO::ERrmODE_EXCEPTION抛出异常可通过以下语句来设置错误处理方式为抛出异常

$db->setAttribute(PDO::ATTR_ERrmODE, PDO::ERrmODE_EXCEPTION);

当设置为PDO::ERrmODE_SILENT时可以通过调用errorCode() 或errorInfo()来获得错误信息,当然其他情况下也可以。2) 因为不同数据库对返回的字段名称大小写处理不同,所以PDO提供了PDO::ATTR_CASE设置项(包括PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER),来确定返回的字段名称的大小写。3) 通过设置PDO::ATTR_ORACLE_NULLS类型(包括PDO::NULL_NATURAL,PDO::NULL_EmpTY_STRING,PDO::NULL_TO_STRING)来指定数据库返回的NULL值在php中对应的数值。4、PDO常用方法及其应用 PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作 PDO::exec() 主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作 PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大(防止sql注入就靠这个)PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID PDOStatement::fetch() 是用来获取一条记录 PDOStatement::fetchAll() 是获取所有记录集到一个集合 PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段PDOStatement::rowCount() :主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。5、PDO操作MYSQL数据库实例

$pdo = new PDO("mysql:host=localhost;dbname=db_demo","root","");

if($pdo -> exec("insert into db_demo(name,content) values('title','content')")){

echo "插入成功!";

echo $pdo -> lastinsertid();

}

?>

$pdo = new PDO("mysql:host=localhost;dbname=db_demo","root","");

$rs = $pdo -> query("select * from test");

$rs->setFetchMode(PDO::FETCH_ASSOC); //关联数组形式

//$rs->setFetchMode(PDO::FETCH_NUM); //数字索引数组形式

while($row = $rs -> fetch()){

print_r($row);

}

?>

foreach( $db->query( "SELECT * FROM feeds" ) as $row )

{

print_r( $row );

}

?>

统计有多少行数据:

$sql="select count(*) from test";

$num = $dbh->query($sql)->fetchColumn();

prepare方式:

$stmt = $dbh->prepare("select * from test");

if ($stmt->execute()) {

while ($row = $stmt->fetch()) {

print_r($row);

}

}

Prepare参数化查询:

$stmt = $dbh->prepare("select * from test where name = ?");

if ($stmt->execute(array("david"))) {

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

print_r($row);

}

}

【下面飘易来说说重点了,如何防止 sql注入】。使用PDO访问MySQL数据库时,真正的real prepared statements 默认情况下是不使用的。为了解决这个问题,你必须禁用 prepared statements的仿真效果。下面是使用PDO创建链接的例子:

$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

setAttribute()

这一行是强制性的,它会告诉 PDO 禁用模拟预处理语句,并使用 real parepared statements 。这可以确保SQL语句和相应

的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。虽然你可以配置文件中设置字符集的属性(charset=utf8),但是需要格外注意的是,老版本的 PHP(

$dbh = new PDO("mysql:host=localhost; dbname=demo", "user", "pass");

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果

$dbh->exec("set names 'utf8'");

$sql="select * from test where name = ? and password = ?";

$stmt = $dbh->prepare($sql);

$exeres = $stmt->execute(array($testname, $pass));

if ($exeres) {

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

print_r($row);

}

}

$dbh = null;

上面这段代码就可以防范sql注入。为什么呢?当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。但是我们需要注意的是以下几种情况,PDO并不能帮助你防范SQL注入

mysql pdo 安全_使用PDO查询Mysql来避免SQL注入风险相关推荐

  1. sql注入获取mysql版本信息_这可能是最全的SQL注入总结,很有用

    SQL注入原理 当客户端提交的数据未作处理或转义直接带入数据库,就造成了sql注入. 攻击者通过构造不同的sql语句来实现对数据库的任意操作. SQL注入的分类 按变量类型分:数字型和字符型 按HTT ...

  2. mysql数据库蛛_超级蜘蛛池之何谓为SQL注入?【基础】

    什么是SQL注入? 还记得小学语文考试上的填空题吗? 题目的意图明显是通过填空来了解答题者的名字和爱好. 比如:我是_______________,喜欢__________________ 如果有同学 ...

  3. pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  4. MySQL学习笔记_上(select查询)

      上次整理了一些练习发到博客上了,也说要发基础的,整理了一下午才算是把查询那块的勉强整理完,下次再整理其他的,另外还在写设计模式和数据结构的草稿,写的差不多会慢慢发的,这两项算是副线发展,主线还是按 ...

  5. mysql 本周函数_【转】MySQL时间函数的使用:查询本周、下周、本月、下个月份的数据...

    MySQL时间函数的使用:查询本周.上周.本月.上个月份的数据[转] /*今天*/ select * from 表名 where to_days(时间字段) = to_days(now()); /*昨 ...

  6. php查询mysql数据库乱码_PHP怎样处理查询MySQL数据库中文乱码?_后端开发

    PHP如何处理查询MySQL数据库中文乱码? 1.将MySQL数据库默许的编码是UTF-8: 2.在MySQL中建立表时,将字符集设置为UTF-8: 3.在PHP中查询数据之前,将数据库编码设置为UT ...

  7. mysql show processlist info null_关于查询mysql processlist的建议

    查询mysql进程,因为数据库的sleep连接很多(一般都会在几千个左右),不建议直接show processlist或者show full Processlist 尽量去用select查询 正在ru ...

  8. jira mysql 启动 失败_重启机器导致mysql启动失败

    一.问题 二.常见解决方案 网上的解决方法大致为 ①空间不足(df -h 查看) ②权限不足(/var/lib文件夹)chown -R mysql:mysql /vdb1/lib/ ③修改my.cnf ...

  9. linux mysql内网_在Linux中mysql的一些基本操作

    在Linux中mysql的一些基本操作 下面介绍一下 一.关于在Linux中mysql的一些基本操作 1.进入mysql "mysql -uroot -p",会提示输入密码,输入密 ...

最新文章

  1. 脑机接口应用于驾驶员的疲劳状态检测综述
  2. 流畅的验证组件:FluentValidation
  3. C语言有序数组转为平衡的二叉树(附完整源码)
  4. 关于房屋的风水学整理
  5. mysql性能优化学习笔记
  6. Java基础(三)——反射、代理
  7. UVA - 1279 Asteroid Rangers (动点的最小生成树)
  8. 如何计算像素当量_「轴承知识」如何通过静承载能力选择轴承
  9. 【python】 实现排列组合公式
  10. APP加固新方向——混淆和瘦身
  11. C/C++电话号码查询系统
  12. Nvidia 英伟达的NSight GPU 调试如何下载
  13. R语言绘图基础篇-柱状图
  14. 基于Opencv自带BP网络的车标简易识别
  15. C++多线程和并发-更新(互斥量的基本概念、使用、作用、案例)-2023/2/12
  16. 【题解】【PTA-Python题库】第4章-13 求误差小于输入值的e的近似值 (20 分)
  17. 天行健,君子必自强不息吗?
  18. input正则邮箱_邮箱的正则表达式验证
  19. 免费视频资源 网站 网易学院 webcast csdn课堂 等等
  20. 基本布局之相对布局(RelativeLayout)

热门文章

  1. 企业如何实现大数据分析平台
  2. 如何进行大数据分析与处理
  3. java sftp_JAVA 实现SFTP服务器功能
  4. mv强制覆盖 shell_一个简单的linux命令 mv
  5. android 笔记本推荐 2015年,IDC:Android平板份额2015年将超iPad
  6. mysql replication 原理_MySQL Replication(复制)基本原理 | 学步园
  7. ercharts一个页面能放几个_Django的页面模版提取(三)
  8. Hive多用户模式搭建
  9. opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍
  10. 笔试编程题常用的一些技巧方法