我刚刚开始研究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();
答案 0 :(得分: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,因此无法将代码注入到查询中。