Mysql 测试登录系统是否受到sql注入的保护

Mysql 测试登录系统是否受到sql注入的保护,mysql,pdo,sql-injection,defensive-programming,Mysql,Pdo,Sql Injection,Defensive Programming,所以对于一个学校项目,我必须制作一个带有登录系统的网站。它有一个用户名和密码字段,以及一个提交按钮。它将用户名和密码与MySQL数据库中的用户名和密码进行比较。如果组合在数据库中,用户可以继续,否则将重定向到登录页面。我使用准备好的PDO语句进行数据库连接 现在,我的老师希望我通过对登录系统执行sql攻击来测试安全性。不幸的是,我不知道在这些盒子里放什么,结果会是什么。例如,我尝试在用户名和密码字段中输入返回true的值,如下所示: 1==1, 1===1, 0 is null 但我不知道

所以对于一个学校项目,我必须制作一个带有登录系统的网站。它有一个用户名和密码字段,以及一个提交按钮。它将用户名和密码与MySQL数据库中的用户名和密码进行比较。如果组合在数据库中,用户可以继续,否则将重定向到登录页面。我使用准备好的PDO语句进行数据库连接

现在,我的老师希望我通过对登录系统执行sql攻击来测试安全性。不幸的是,我不知道在这些盒子里放什么,结果会是什么。例如,我尝试在用户名和密码字段中输入返回true的值,如下所示:

1==1,  1===1,  0 is null
但我不知道我是否成功,也不知道攻击者是否可以通过这些语句访问或截断我的数据库

Html代码:

<form method="post" action="includes/login.php">
<input type="text" name="gebruikersnaam" >
<input type="password" name="wachtwoord" >
<input type="submit"  value="login">
</form>
想象一下这个问题:

SELECT id FROM users WHERE email=? AND password=? LIMIT 1
现在想象一下这些值是
foo@bar.hello
和密码的空字符串:

SELECT id FROM users WHERE email='foo@bar.hello' AND password='' LIMIT 1
如果这些凭据不在您的数据库中,则这不会有害。现在让我们给出不同的输入:

对于
电子邮件
我们填写一个空字符串,对于
密码
我们插入
”或1=1
(注意第一个撇号)

您的老师希望您了解这是否意味着您的SQL server将执行以下查询:

SELECT id FROM users WHERE email='' AND password='' OR 1=1 LIMIT 1
SQL是一种声明性语言,您可以使用它声明对结果的期望。如果您的服务器按照上述方式解释我们的输入,那么第一个用户
id
将被认为是正确的,因为一等于一

想象一下这个查询:

SELECT id FROM users WHERE email=? AND password=? LIMIT 1
现在想象一下这些值是
foo@bar.hello
和密码的空字符串:

SELECT id FROM users WHERE email='foo@bar.hello' AND password='' LIMIT 1
如果这些凭据不在您的数据库中,则这不会有害。现在让我们给出不同的输入:

对于
电子邮件
我们填写一个空字符串,对于
密码
我们插入
”或1=1
(注意第一个撇号)

您的老师希望您了解这是否意味着您的SQL server将执行以下查询:

SELECT id FROM users WHERE email='' AND password='' OR 1=1 LIMIT 1
SQL是一种声明性语言,您可以使用它声明对结果的期望。如果您的服务器按照上述方式解释我们的输入,那么第一个用户
id
将被认为是正确的,因为一等于一

想象一下这个查询:

SELECT id FROM users WHERE email=? AND password=? LIMIT 1
现在想象一下这些值是
foo@bar.hello
和密码的空字符串:

SELECT id FROM users WHERE email='foo@bar.hello' AND password='' LIMIT 1
如果这些凭据不在您的数据库中,则这不会有害。现在让我们给出不同的输入:

对于
电子邮件
我们填写一个空字符串,对于
密码
我们插入
”或1=1
(注意第一个撇号)

您的老师希望您了解这是否意味着您的SQL server将执行以下查询:

SELECT id FROM users WHERE email='' AND password='' OR 1=1 LIMIT 1
SQL是一种声明性语言,您可以使用它声明对结果的期望。如果您的服务器按照上述方式解释我们的输入,那么第一个用户
id
将被认为是正确的,因为一等于一

想象一下这个查询:

SELECT id FROM users WHERE email=? AND password=? LIMIT 1
现在想象一下这些值是
foo@bar.hello
和密码的空字符串:

SELECT id FROM users WHERE email='foo@bar.hello' AND password='' LIMIT 1
如果这些凭据不在您的数据库中,则这不会有害。现在让我们给出不同的输入:

对于
电子邮件
我们填写一个空字符串,对于
密码
我们插入
”或1=1
(注意第一个撇号)

您的老师希望您了解这是否意味着您的SQL server将执行以下查询:

SELECT id FROM users WHERE email='' AND password='' OR 1=1 LIMIT 1

SQL是一种声明性语言,您可以使用它声明对结果的期望。如果您的服务器按照上述方式解释我们的输入,那么第一个用户
id
将被认为是正确的,因为一等于一

实际上,它很容易受到SQL注入的影响

在尝试注入时要注意的是,我是否可以关闭我现在所在的语句,并在末尾添加更多内容

因此,如果输入username=
123456'-
SQL语句将变成
SELECT*FROM leerling,其中leerlingnummer='123456'-'和wachtwoord='unimortant'

--开始一个注释,所以它所做的只是选择输入的学生号,忽略密码


PDO有很好的替代方案来防止这种情况发生。您可以声明SQL查询,并仅通过使用
:lable
输入用户信息的位置,然后将用户输入绑定到这些点。这一页在解释它方面做得更好。这样,所有用户数据都与命令的其余部分明确分开,并将被视为一个普通字符串,而不是命令。正在停止SQL注入。

事实上,它很容易受到SQL注入的影响

$sql="SELECT * FROM users WHERE username = '{$_REQUEST['username']}' AND password = '{$_REQUEST['password']}";
在尝试注入时要注意的是,我是否可以关闭我现在所在的语句,并在末尾添加更多内容

因此,如果输入username=
123456'-
SQL语句将变成
SELECT*FROM leerling,其中leerlingnummer='123456'-'和wachtwoord='unimortant'

--开始一个注释,所以它所做的只是选择输入的学生号,忽略密码


PDO有很好的替代方案来防止这种情况发生。您可以声明SQL查询,并仅通过使用
:lable
输入用户信息的位置,然后将用户输入绑定到这些点。这一页在解释它方面做得更好。这样,所有用户数据都与命令的其余部分明确分开,并将被视为一个普通字符串,而不是命令。正在停止SQL注入。

事实上,它很容易受到SQL注入的影响

$sql="SELECT * FROM users WHERE username = '{$_REQUEST['username']}' AND password = '{$_REQUEST['password']}";
在尝试注入时要注意的是,我是否可以关闭我现在所在的语句,并向en添加更多内容