【php】PDO数据库防sql注入

22 篇文章 0 订阅
7 篇文章 0 订阅

安全的方式:

$pdo = new PDO('mysql:host=localhost;dbname=phptry','username','passwd');
$pdo->query("SET NAMES 'utf8'");//字符集设置
//$pdo->query("SET character_set_client=binary");?

//设置不在本地做sql语句预处理,php5.3.6之后默认
//$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

//修改默认的错误显示级别
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//sql预处理和执行------------------------
$statement = $pdo->prepare("select * from user where username = ?");
$statement->bindValue(1,'admin',PDO::PARAM_STR);//bindvalue绑定":XXX"或者用替代第几个问号,bindparam只能绑定变量
$statement->execute();

//处理返回的结果集----------------------------
//取不到则返回false
$row = $statement->fetch(PDO::FETCH_ASSOC);
//取不到则返回空数组
//$row = $statement->fetchAll(PDO::FETCH_OBJ);

//debug模式下查看预处理语句参数,要在execute()方法后调用
//$statement->debugDumpParams(); 

//查看结果
echo htmlentities(count($row));  //count()/sizeof()
var_dump($row);  //输出参数类型和值

或者写成:


$pdo = new PDO('mysql:host=localhost;dbname=phptry;charset=utf8','username','passwd');

//修改默认的错误显示级别
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//sql预处理和执行------------------------
$statement = $pdo->prepare("select * from user where username = ?");
$statement->bindValue(1,'admin',PDO::PARAM_STR);
$statement->execute(array("admin"));//传递数组参数

//省略----------------------------


bindValue和bindParam会对特殊符号进行转义。

$statement->debugDumpParams();结果显示:

SQL: [37] select * from user where username = ?
Params:  1
Key: Position #0:
paramno=0
name=[0] ""
is_param=1
param_type=2
Array

防sql注入原理:
在php5.3.6之后,pdo不会在本地对sql进行拼接然后将拼接后的sql传递给mysql server处理(也就是不会在本地做转义处理)。pdo的处理方法是在prepare函数调用时,将预处理好的sql模板(包含占位符)通过mysql协议传递给mysql server,告诉mysql server模板的结构以及语义。当调用execute时,将两个参数传递给mysql server。由mysql server完成变量的转移处理。将sql模板和变量分两次传递,即解决了sql注入问题。


sql注入测试:

$statement = $pdo->prepare("select * from user where username = ?");
$statement->execute(array("'' or 1 > 0"));
$row = $statement->fetchAll(PDO::FETCH_OBJ);
var_dump($row);

//输出array(0) { } ,成功

参考链接:

pdo调用方法以及防sql注入原理
PDO防注入原理分析以及使用PDO的注意事项

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值