什么是最安全的方式来处理mysql数据库中的数据

时间:2013-04-06 13:12:08

标签: php mysql database security pdo

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

我听说使用PDO会给你带来麻烦,是不是?

3 个答案:

答案 0 :(得分: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(在低级别上具有额外的抽象级别),我从来没有遇到任何问题。

答案 1 :(得分:1)

通常,如果您使用mysql_query而不是PDO包装,则从数据库导入/导出数据的安全性不会更高或更低。您需要注意的重要事项是确保不安全的数据源。通常 - 不要相信通过GET,POST,COOKIE等机制来自用户的任何内容,并将其用作代码的参数 - 将其视为所有恶意数据并首先验证您期望的格式。

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

<?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的哪些问题?

答案 2 :(得分:1)

您正在使用的函数名称中没有任何基本安全的信息。

使用它们的方式可以是安全的(或不是)。可以使mysql_query的安全性不低于PDO。相反 - 如果使用不当,PDO很容易“可能导致问题”。

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

  1. 应通过占位符
  2. 将每个动态文字添加到查询中
  3. 如果无法使用plcaceholder - 必须将值列入硬编码的允许值列表
  4. 由于PDO提供了对开箱即用的占位符的支持,因此它通常优于mysql_query。但是,此支持非常有限,如果您希望获得全面保护,则必须创建自己的解决方案,或使用一些现成的库,如SafeMySql

相关问题