3

我正在从传统mysql_query()的参数化查询切换到 PDO,以利用它的安全优势,我有几个问题。首先,就magic_quotes 而言,有什么需要做的吗?这个网络应用程序将安装在不同配置的系统上,有些会(不幸地)打开它们,而另一些会关闭。以前,我正在执行整个 if 语句,以了解addslashes()何时关闭输入数据......需要对以下 PDO 查询进行哪些操作:

$dbh = new PDO("mysql:host=$db_server;dbname=$db_database", $db_username, $db_password);
$sth = $dbh->prepare("SELECT * FROM `users` WHERE `username` = :username ");
$sth->bindParam(':username', $_POST['username']);
$sth->execute();
if($row = $sth->fetch()){
    // Yup
}
$dbh = null;

另外,到底有必要关闭数据库处理程序吗?不这样做有什么害处?对于将安装在许多不同服务器设置上的 CMS,PDO 是一个不错的选择吗?PDO 是否足够普遍,可以在大多数服务器上启用?

提前致谢!

4

2 回答 2

4

这个网络应用程序将安装在不同配置的系统上,有些会(不幸地)打开[magic quotes],而另一些则会关闭。

正如我在对另一个答案的评论中指出的那样,PHP 手册有一个完整的部分来处理处理魔法引号的恐怖。您通常可以在 .htaccess 中本地禁用它,或者在数据进入时更正数据。我个人不会与默认启用它的托管服务提供商开展业务。

以前我正在执行整个 if 语句,以了解addslashes()何时关闭输入数据

哎呀! addslashes不够的保护。使用旧的 MySQL 扩展时,需要设置字符集 mysql_real_escape_string 使用。如果不这样做,您可能会面临巨大的漏洞

... 像这样的 PDO 查询需要做什么:

除了设置连接字符集,什么都没有!PDO 将尽可能使用真正的准备好的语句。这意味着它将首先将带有占位符的查询发送到服务器以便它可以处理它,然后它将单独发送参数。这使得查询免受 SQL 注入的影响。

(一些数据库不支持使用 PDO 准备好的语句。对于这些,PDO 将处理查询,用带引号的转义值替换占位符。结果是相同的——不受 SQL 注入的影响。)

另外,到底有必要关闭数据库处理程序吗?不这样做有什么害处?

就像其他 PHP 数据库处理程序一样,不需要关闭连接——当脚本结束时,连接将关闭。(甚至不要考虑持久连接。)

对于将安装在许多不同服务器设置上的 CMS,PDO 是一个不错的选择吗?PDO 是否足够普遍,可以在大多数服务器上启用?

PDO 在 PHP 5.1 中成为标准,但这并不意味着它始终可用。大多数 Linux 发行版都分离了PHP 的所有数据库访问选项,因此安装它们也会安装必需的库。有时,不称职或缺乏经验的托管服务提供商不会安装 PDO 包以配合其他数据库访问选项,而没有意识到他们在做什么。这通常通过简单地要求他们启用 PDO 来纠正,如果他们不愿意或不能切换到另一台主机。

许多现代框架更喜欢在 PDO 之上构建,但提供了其他选项。例如,Zend Framework 的 Zend_Db具有 PDO、mysqli 和其他一些适配器。如果您担心 PDO 并不总是可用,那么使用适配器层可能对您很有效。(与大多数 ZF 组件一样,Zend_Db 不严重依赖其他 ZF 组件,这意味着您可以轻松地将其与您的代码捆绑在一起。)

于 2011-04-22T18:24:23.410 回答
3

我不会太担心magic_quotes。PDO 是在 PHP 5.1 中引入的,此时magic_quotes默认关闭一段时间。应该有非常非常少的主机支持 PDO 但启用了 magic_quotes。

如果你仍然想处理那个小百分比,我建议你简单地修改 $_GET、$_POST 和 $_COOKIE 全局变量并去掉magic_quotes添加的斜杠。或者,如果您不想直接更改它们,请将它们包装在某种类型的 Request 对象中。

于 2011-04-22T08:03:50.067 回答