在系统中防止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.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
将被认为是正确的,因为其中一个等于一。
事实上,它容易受到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?