0

因此,对于一个学校项目,我必须制作一个带有登录系统的网站。它有一个用户名和密码字段,以及一个提交按钮。它将用户名和密码与 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>

php认证:

$myusername=$_POST['gebruikersnaam']; 
$mypassword=$_POST['wachtwoord']; 
$sql="SELECT * FROM leerling WHERE leerlingnummer='$myusername' and wachtwoord='$mypassword'";
$sql2="SELECT * FROM lop WHERE gebruikersnaam='$myusername' and wachtwoord='$mypassword'";
$statement2=$conn->prepare($sql2);
$statement2->execute();
$count2=$statement2->rowcount();

if($count2==1){proceed}

$statement = $conn->prepare($sql);
$statement->execute();
$count= $statement->rowcount();

if($count==1){proceed}

else {deny access}
4

3 回答 3

1

想象一下这个查询:

SELECT id FROM users WHERE email=? AND password=? LIMIT 1

现在想象这些值将是foo@bar.hello一个空字符串password

SELECT id FROM users WHERE email='foo@bar.hello' AND password='' LIMIT 1

如果这些凭据不在您的数据库中,这不会有害。现在让我们给出不同的输入:

因为email我们填写一个空字符串,password我们插入' OR 1=1(注意第一个撇号)

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

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

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

于 2014-04-12T13:57:14.667 回答
1

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

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

所以如果你输入 username = 123456' --SQL 语句就变成SELECT * FROM leerling WHERE leerlingnummer='123456' --' and wachtwoord='unimortant'

-- 开始评论,所以它所做的就是选择输入的任何学生编号,而忽略密码。

PDO 有很好的替代方法来防止这种情况发生,称为 Prepared Statements?您声明您的 SQL 查询并仅使用or输入将要输入用户信息的位置:lable,然后将用户输入绑定到这些点。该页面在解释它方面做得更好。这样,所有用户数据都清楚地与命令的其余部分分开,并将被视为文字字符串而不是命令。停止 SQL 注入。

于 2014-04-12T13:57:46.207 回答
1
$sql="SELECT * FROM users WHERE username = '{$_REQUEST['username']}' AND password = '{$_REQUEST['password']}";

以这种格式编写查询将避免 sql 注入。

    $sql = 'SELECT * FROM users WHERE username = ? AND password = ?';
    $query = $db->prepare($sql);
    $query->bindParam(1, $_REQUEST['username']);
    $query->bindParam(2, $_REQUEST['password']);

或者将参数传递给 mysql_real_escape_string 函数,然后传递给查询。

$username=mysql_real_escape_string($_REQUEST['username']);
$password=mysql_real_escape_string($_REQUEST['password']);
于 2014-04-12T14:02:48.457 回答