Php SQL注入理论
我一直在数据库中使用ORM层,所以我不介意SQL注入,但是一个朋友给了我这个任务,我仍然不知道如何解决它 我知道PHP脚本只是检查查询的返回是否为!=null(找到与输入的用户名和密码匹配的用户名) PHP中的查询本身如下所示:Php SQL注入理论,php,mysql,security,sql-injection,database-theory,Php,Mysql,Security,Sql Injection,Database Theory,我一直在数据库中使用ORM层,所以我不介意SQL注入,但是一个朋友给了我这个任务,我仍然不知道如何解决它 我知道PHP脚本只是检查查询的返回是否为!=null(找到与输入的用户名和密码匹配的用户名) PHP中的查询本身如下所示: $sql = "SELECT name FROM users WHERE name='".$name. "' AND password='".$password. "'"; 归档此查询返回的最佳方式是什么!=null或正在检索有效的登录数据(用户名和密码)。密码以明
$sql = "SELECT name FROM users WHERE name='".$name. "' AND password='".$password. "'";
归档此查询返回的最佳方式是什么!=null或正在检索有效的登录数据(用户名和密码)。密码以明文形式存储在数据库中。我知道存储简单是不好的,我知道使用PDO是好的,但我不知道如何解决他给我的这个有趣的任务,可能是因为我一直在使用PDO。假设我们有两个输入变量:
$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
,并显示用户表中的每个名称。
这当然是一个基本的例子。删除整个表也会造成更大的危害。假设我们有两个输入变量:
$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
,并显示用户表中的每个名称。
这当然是一个基本的例子。删除整个表也会造成更大的危害。如果您想检索密码,则需要注入密码
$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;--'
请参阅,了解攻击者将如何通过注入查询来解决此问题 如果您想要检索密码,您可以插入
$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;--'
请参阅,了解攻击者将如何通过注入查询来解决此问题 在数据库中存储普通密码是一个很大的禁忌。它们确实应该被散列。此外,考虑有人输入<代码>的情况;将表用户拖放到此语句中。哎呀,你的桌子不见了。这意味着您需要转义userinputs(永远不要信任用户输入)或使用准备好的语句。我推荐后者。可能的重复不是如何防止SQL注入,正如我告诉过我的,我使用db抽象层,它更多的是理论。
“所以我不介意SQL注入”
-攻击者喜欢这种自信<代码>“PHP中的查询本身看起来像[…]”——我的朋友,这是一个SQL注入漏洞<代码>“密码以明文形式存储在数据库中。”-攻击者也喜欢这一点。。。更重要的是,你到底在问什么?你在这里试图“解决”什么?你被要求破坏你的ORM管理的数据库,或者你被给予一个查询并告诉它如何被入侵?类似“如果我使用mysql_*函数,我就这么做……”这样的话,不管你在代码中实际做了什么?在数据库中存储普通密码是一个大禁忌。它们真的应该被散列。此外,考虑有人输入<代码>的情况;将表用户拖放到此语句中。哎呀,你的桌子不见了。这意味着您需要转义userinputs(永远不要信任用户输入)或使用准备好的语句。我推荐后者。可能的重复不是如何防止SQL注入,正如我告诉过我的,我使用db抽象层,它更多的是理论。“所以我不介意SQL注入”
-攻击者喜欢这种自信<代码>“PHP中的查询本身看起来像[…]”——我的朋友,这是一个SQL注入漏洞<代码>“密码以明文形式存储在数据库中。”-攻击者也喜欢这一点。。。更重要的是,你到底在问什么?你在这里试图“解决”什么?你被要求破坏你的ORM管理的数据库,或者你被给予一个查询并告诉它如何被入侵?类似“如果我使用mysql_*函数,我就这么做……”这样的话,不管你在代码中实际做了什么?有没有办法检索用户的密码?获取用户名列表并不难。有没有办法检索用户的密码?获取用户名列表并不难。