18

我一直在阅读一些关于使用 mysqli 与 pdo 在 php 中使用 mysql 的问题。

我见过诸如mysqli 或 PDO 之类的问题——优缺点是什么?从 mysql 迁移到 mysqli 或 pdo?,它们都专门处理 mysqli v pdo 。我对这两种方法中的哪一种更好并不感兴趣。

我想知道为什么应该避免使用 mysql_ 函数。当然,根据 PHP 的文档http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated,它们正在被弃用,线程PHP PDO 和 MySQLi 建议使用 PDO 和MySQLi 比较强大,和线程MySQL、MySQLi 和 PDO 有什么区别?意味着这些较新的方法更安全。

总的来说,我想知道 mysql_ 方法的最大弱点是什么,以及避免它的原因是什么(我想更具体地说,不仅仅是因为它已被弃用)。我计划更新我受影响的脚本,并对为什么不推荐使用这种旧方法感到好奇。

谢谢!

4

3 回答 3

23

mysql_query函数的设计是这样的,您必须小心地转义您注入的每一个数据,如果您错过了一个,您的整个应用程序都可能被自动 SQL 漏洞利用工具破坏。

PDO 和 PDO都mysqli支持占位符,这些占位符是确保您的查询不受 SQL 注入错误影响所必需的。调用mysql_real_escape_string所有内容不仅乏味,而且容易出错,这就是问题出现的地方。

这些mysql函数是 PHP 早期的产物,并且比mysqli作为选项提供的新的面向对象特性或设计上的 PDO 受到的限制要大得多。

使用这两个新接口之一有很多很好的理由,但最重要的是,该mysql_query函数太危险了,无法在生产代码中使用。有了它,您将永远远离一些非常严重的问题。

充满密码和信用卡号码的数据库不断出现是有原因的。拥有一个明显的 SQL 注入点使得完全接管一个站点几乎太容易了。

于 2012-08-23T17:47:27.193 回答
8

从选择MySQL API @ PHP.net

// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);

// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);

创建一个对象,就像 mysqli 和 PDO 一样,是编写任何现代软件的推荐方式。mysql 库是为 PHP 2.0 版发布的,从那时起就没有进行过重大的重写。PHP 2.0 于 1997 年发布,这足以解释为什么不使用它。

于 2012-08-23T17:52:20.687 回答
2

一方面,如果您没有正确手动清理输入,mysql 函数极容易受到 SQL 注入的影响。mysqli 和 pdo 具有参数化的 sql 语句选项,避免了这种风险。在我看来,他们通常也有更好的编码风格。

于 2012-08-23T17:42:21.930 回答