PHP PDO 模块,真的可以防SQL注入?

去圣西罗-为尤文喝彩 2011-08-15 09:16:10
网上搜到一篇 PHP 防SQL注入的文章
原文地址

E文不算很好,理解不够全面,求前辈们解释一下。

下面是我学习PDO后自己写的代码。

php.ini

extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll


求教:PHP PDO 模块,真的可以防SQL注入?用了那个$db->prepare,真的连addslashes都不需要了?
另外, PDO设置连接超时,也是 set_time_limit(秒数)?谢谢。

$dbms='mysql';
$host='localhost';
$dbName='test';
$user='root';
$pass='root';
$dsn="$dbms:host=$host;dbname=$dbName";
$db = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';"));
$preparedStatement = $db->prepare('INSERT INTO mytable (title,content,date) VALUES (:title,:content,:date)');
$preparedStatement->execute(array(':title' => '$_POST['title']',':content' => '$_POST['content']',':date' => '$_POST['date']'));
...全文
1288 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
明白了,PDO,只是一个手段,并非最合适的方法。
  • 打赏
  • 举报
回复
UP ++

大虾们,凭你们的经验,pdo可以多大程度 抵挡 SQL注入?
binarie 2011-08-23
  • 打赏
  • 举报
回复
PDO的变量绑定bindParam和bindValue会自动添加转义。

但无法对表或字段的名字进行变量绑定。

因此当表名或字段名不确定(即可能从用户输入中获取),而需要动态组装SQL语句时,即使是用了PDO变量绑定来提供字段的值,应当注意表名和字段名部分的过滤。
xuzuning 2011-08-23
  • 打赏
  • 举报
回复
addslashes 的作用是转义特殊字符
由于 SQL 指令中,串的分界符是单引号,所以需要对串中的单引号做转义处理

PDO 是封装好的数据库操作类,自然也就封装了自己的转义方法 quote,而无需借助第三方

注意这只是转义,而不是过滤

所谓 SQL 注入,是源于 mssql 提供的 HTTP 协议的查询功能的。
用户可以通过 url 参数访问 mssql 数据库,mssql 以列表方式给出结果;
由于 mssql 的存储过程具有仅次于管理员的权限,并具有访问操作系统的能力。
所以一旦被利用,就可能导致灾难性后果

php 对于 SQL 注入采取了以下防范措施
1、magic_quotes_gpc 自动转义,php5.3 起已不可关闭
2、除声明存储过程的 SQL 指令外,所用 SQL 指令都不允许出现语句结束符“;”(当然串中的是例外),即
每次只能执行一条指令。杜绝了通过重构 SQL 指令串造成攻击的可能性
3、不可能通过 php 提供的数据库操作函数在一句代码中完成查询与输出动作,给伪造查询条件获取私密资料带来困难。PDO 反而是可以的


  • 打赏
  • 举报
回复
大虾们,凭你们的经验,pdo可以多大程度上抵挡住SQL注入?
  • 打赏
  • 举报
回复
恩,晚些时候自己测试看看。
pdo的中文教程不多,网上有的都是抄来抄去的那2篇。
打算再搜搜E文的介绍。
BooJS 2011-08-16
  • 打赏
  • 举报
回复
Yes.
最好的测试方法是打开mysql的query log,模拟一些数据尝试注入(gpc quote打开和关闭都要尝试),然后去log文件看最终语句生成
xinglu1983 2011-08-16
  • 打赏
  • 举报
回复
prepare应该不会帮你过滤的吧?
n久不用pdo了,记不太清了,我记得当时都是用pdo的quote过滤。
jlzan1314 2011-08-16
  • 打赏
  • 举报
回复
当然!?号的作用,函数会替换变量的
che253604783 2011-08-16
  • 打赏
  • 举报
回复
你自己测试下啊
  • 打赏
  • 举报
回复
没人知道吗?CSDN前辈不少啊~

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧