PHP-php操作mysql使用PDO , 是否有必要做防SQL注入过滤 ?

发布于 2016-12-04 00:55:53 字数 73 浏览 1210 评论 2

我们php操作mysql使用的是PDO , 请问还有没有必要做防止SQL注入的过滤啊 ???
PDO是不是参数化查询啊??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灵芸 2017-10-19 12:16:53

如果所有操作使用的都是PDO的预处理($pdo->prepare()),那么确实不需要防注入。
$pdo->exec()和$pdo->query()都需要防注入,用$pdo->quote($参数)来转义参数中的引号。
使用预处理:

$pdo=new PDO('mysql:dbname=test;host=localhost;port=3306','root','0123456789abcdef');
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); //设置记录的返回模式:关联数组

$pdo->exec('SET NAMES UTF8'); //防止乱码
$sql='SELECT uid,name FROM '.TABLE_PRE.'user WHERE regtime>? AND regtime<=? AND name like ?';
$sqldata=array(time()-3600*24*7, time(), '%老虎%');
$stm=$pdo->prepare($sql);
$stm->execute($sqldata);
var_dump($stm->fetchAll());

灵芸 2017-08-03 01:40:13

没有必要额外考虑过滤,但是要防止pdo的一些机制造成注入,例如:

mysql的prepare其实是本地PHP客户端模拟的,并没有根据你mysql的设置做字符集的调整。应该交与mysql server端做prepare,同时得调用mysql_set_character_set去操作,server才会按照字符集去做转义。
php本地模拟的prepare底层就是mysql_real_escape_string,所以必须得用mysql_set_character_set去设置mysql->charset,否则就存在字符集问题。

也就是说在php本地调用pdo prepare中的mysql_real_escape_string来操作query,使用的是本地单字节字符集,即编码为xbfx5cx27,并带入到mysql中查询,由于使用set names设置了连接字符集,mysql使用内部操作字符集gbk来进行操作,即执行
“SELECT * FROM test WHERE name = ‘xxx’ or 1=1 /* LIMIT 1″;从而注入成功

解决方案:使用mysql_set_character_set函数来设置字符集。

以上来自MYSQL注入:MYSQL PDO宽字符SQL注入深入分析

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文