-3

使用 PDO 是否比普通的经典“mysql_query”更安全?还是有其他更安全的方法可以从 mysql db 导入和导出数据

我听说使用 PDO 可能会给您带来问题,对吗?

4

3 回答 3

1

我会使用带有参数绑定的 PDO,而不是简单的 mysql_query。这将确保您不必处理项目的 SQL 注入问题

这是我从 php.net 文档中获取的一个简单示例:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

以这种方式使用 pdo 肯定更安全。它还将处理变量转换。我在所有当前的 php 项目中都使用 PDO(在具有附加抽象级别的低级别),我从来没有遇到过任何问题。

于 2013-04-06T13:18:53.873 回答
1

一般来说,如果您使用mysql_queryPDO 包装器而不是 PDO 包装器,那么从数据库导入/导出数据并不会更加安全。您需要注意的重要事项是保护不安全的数据源。一般来说 - 不要相信来自用户的任何东西,例如 GET、POST、COOKIE 等,并用作代码的参数 - 将其视为所有恶意数据并首先验证为您期望的格式。

PDO 在某种意义上“更安全”,因为它很容易参数化您的 SQL 查询并避免通常是最常见的 Web 攻击类型的 SQL 注入类型的攻击。例如:

<?php
$id = (isset(_$GET['id']))? _$GET['id'] : ''; // Possibly unsafe data from user
$dbh = new PDO('mysql:host='.$host.';dbname='.$name, $user, $pass);
$sth = $dbh->prepare("SELECT * FROM `table` WHERE `id`=?");
$sth->execute(array($id));
?>

通过使用像上面这样的参数化查询,其中占位符?被预期的特定数据查询替换,您可以有效地防止 SQL 注入发生,因为 PDO 然后将您从中获得的数据_$GET['id']视为“数据”,而不是可能是查询字符串的一部分(这可能会导致 SQL 注入)。

例如,如果您将通过将GET数据附加到查询来直接插入数据,例如:

$query = "SELECT * FROM `table` WHERE `id`=".$_GET['id'];

这很容易导致 SQL 注入。永远不要那样做。_$GET如果变量未经过验证或过滤,SQL 的最后一部分可以以各种方式注入您从未打算执行的额外 SQL 。如果在上面的示例中用户提供了以下字符串_$GET['id']-"1;DROP TABLE table;"这将有效地删除您的用户表 - 这是您从未打算做的事情,那么结果查询将如下所示:

"SELECT * FROM `table` WHERE `id`=1;DROP TABLE table;"

首先,您应该尽一切可能防止获取无效数据,例如,如果您期望整数,您可能会这样做:

$id = (isset(_$GET['id']))? _$GET['id'] : ''; // Possibly unsafe data from user
$id = intval($id);  // Make sure the data is integer at all times
if ($id < 0) $id = 0; // Make sure it is positive integer at all times

这样你就可以确保数据是预期的格式。

通过首先验证数据,然后使用参数化查询插入数据库,您可以确保多层安全性,帮助您摆脱数据库中的无效条目以及无效代码行为。正如下面评论中的“您的常识”所建议的那样,它并不能使其对所有类型的攻击都绝对安全,但它确实大大降低了它们的可能性。

intval不是唯一可以帮助您的功能,您还可以检查:

http://php.net/manual/en/function.filter-var.php

您指的是关于 PDO 的哪些问题?

于 2013-04-06T13:19:11.873 回答
1

您正在使用的函数名称中没有什么本质上是安全的。

这是使用它们的方式可能是安全的(或不安全)。可以使 mysql_query 的安全性不亚于 PDO。相反,如果使用不当,PDO 很容易“给您带来麻烦”。

因此,在 mysql 查询(不是数据库)中处理数据的最安全方法是:

  1. 每个动态文字都应仅通过占位符添加到查询中
  2. 如果不能使用 plcaceholder - 值必须针对硬编码的允许值列表列入白名单

由于 PDO 提供了开箱即用的占位符支持,因此它通常优于 mysql_query。但是这种支持非常有限,想要得到全面的保护,就得自己创建解决方案,或者使用一些现成的库,比如SafeMySql

于 2013-04-06T13:20:51.283 回答