【发布时间】:2013-09-08 17:54:33
【问题描述】:
我有这个代码:
<?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
我已经读过这个:Are PDO prepared statements sufficient to prevent SQL injection? 但它确实没有回答我的问题。然而,它给了我一个通过的方法。 @duskwuff 的解决方案与我的解决方案相同。因此,对于管理员来说,如果应该将其删除或标记为重复是可以的。但我坚持认为,这有助于人们了解 pdo prepare 是如何被黑客入侵的。
【问题讨论】:
-
prepare不会使您的代码安全。如果您使用外部数据构建了 SQL 命令,那么您将处于危险之中。 -
不需要一个“敬业的团队成员”就可以说解决方案很糟糕。即使它是您自己的代码,从 GET 中获得表名也是非常可耻的。意味着 数据库结构首先存在缺陷,除了那种实际上没有使用准备好的语句的方法。仍然帮助破解网站管理员是一种耻辱。
-
关于“敬业的团队成员”的故事仍然是廉价的谈话。为了证明这段代码可以被黑,你已经有一个工作的 DROP TABLE 就足够了。
-
php.net/manual/en/mysqli.quickstart.prepared-statements.php 这样做就安全了,你没有绑定参数...
标签: php mysql pdo sql-injection