在系统中防止SQL注入

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

想象一下这个查询:

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

现在想象一下这些值是foo@bar.hellopassword的空字符串:

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将被认为是正确的,因为其中一个等于一。


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

在尝试注入时要注意的是,我可以关闭我现在正在使用的语句并添加更多内容。

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

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

PDO有很好的选择来防止这种情况发生,称为预备陈述。 你声明你的SQL查询,并只输入用户信息输入的地方,通过使用?:lable ,然后将用户输入绑定到这些点。 该页面在解释它方面做得更好。 通过这种方式,所有的用户数据都与命令的其余部分明显分开,并且将被视为字符串而不是命令。 停止SQL注入。


$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']);
链接地址: http://www.djcxy.com/p/93789.html

上一篇: in system is protected against sql injection

下一篇: How to make prepared statement using PDO in advanced queries?