我有这个代码:
<?php
$table = $_GET ["table"];
$query = "SELECT 1 FROM $table";
$st = $pdo->prepare($query);
$st->execute();
这不是真正的代码,但它是一个例子。
如果我做:
hacked.php?table=users;DROP TABLE users;
它会起作用,因为它没有正确转义。
但是,如果我想更新这样的信息:
hacked.php?table=users; UPDATE users SET name="abc" WHERE name="def";
它不起作用,因为它被转义了,pdo 会将查询转换为
SELECT 1 FROM users; UPDATE users SET name=\"abc\" WHERE name=\"def\";
显然它失败了。
反正有没有使这个查询有效?
编辑 1
我们团队中有一个人只致力于检查我的代码并破解它。所以我想做好准备,如果这可以以某种方式完成。
编辑 2
我已经读过这个:PDO 准备好的语句是否足以防止 SQL 注入?但它确实没有回答我的问题。然而,它给了我一个通过的方法。@duskwuff 的解决方案与我的解决方案相同。因此,对于管理员来说,如果应该将其删除或标记为重复是可以的。但我坚持认为,这有助于人们了解 pdo prepare 是如何被黑客入侵的。