1

我最近才开始研究 pdo,因为我已经坚持使用 mysql 太久了。现在我正在将一些脚本翻译成 PDO。

这对注射完全安全吗?

$name = isset($_GET['name']) ? $_GET['name'] : null;

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = '$name'");
$stmt->execute();
$row = $stmt->fetch();



$stmt = $db->query("SELECT *, tr.name, t.name AS teamName FROM player AS p 
                LEFT JOIN team_ranks AS tr ON tr.id = p.rank_id 
                LEFT JOIN teams AS t on t.id = tr.team_id
                WHERE p.id = {$row['id']}");
$row = $stmt->fetch();
4

1 回答 1

6

简短的回答:没有。你误解了准备好的陈述。

这一行仍然只是使用 PHP 双引号扩展创建一个静态 SQL 字符串。PDO/MySQL 不知道你的变量在哪里,所以不能保护你免受注入。

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = '$name'");

你需要做的是:

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = :name");

这里,:name是一个传递给数据库的占位符,说“当这个语句实际运行时,这里会有一个变量”。然后要执行它,您需要为该占位符传递一个值,就像将参数传递给函数一样:

$stmt->execute(array(':name' => $name));

或者,您可以使用bindParam()为 PDO 提供有关参数的更多信息:

$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->execute();

数据库现在知道传入的变量应该被视为一个字符串,而不是解释为 SQL,因此无法将代码注入到查询中。

于 2013-06-10T02:53:46.093 回答