这是我第一次使用SESSIONS的登录系统。 只是想知道,如果SQL注入安全吗?
<?php
$username = $_POST['username'];
$password = $_POST['password'];
if(isset($username, $password)) {
if(get_magic_quotes_gpc()) {
$ousername = stripslashes($username);
$uusername = mysql_real_escape_string(stripslashes($username));
$opassword = stripslashes($_POST['password']);
} else {
$uusername = mysql_real_escape_string($username);
$opassword = $password;
}
$req = mysql_query('select password,id from users where username="'.$uusername.'"');
$dn = mysql_fetch_array($req);
if($dn['password']==$opassword and mysql_num_rows($req)>0)
{
$form = false;
$_SESSION['username'] = $_POST['username'];
$_SESSION['userid'] = $dn['id'];
echo 'Logged in m8';
} else {
$form = true;
$message = 'The username or password is incorrect.';
}
} else {
$form = true;
}
if($form)
{
if(isset($message)) {
echo '<div class="message">'.$message.'</div>';
}
?>
我之前在我的highscores脚本上得到了SQL注入,所以我想知道我的简单会话登录脚本是否有任何,我40%有一个.. 什么通常导致SQL注入? 谢谢!
答案 0 :(得分:1)
虽然你的代码没问题,但你的想法的保护是错误的 mysql_real_escape_string不能防止注入。它确实格式化字符串。 只要你的字符串格式正确,它们就是安全的。
当您尝试使用相同的函数格式化非字符串时,问题就开始了 - 例如数字 它变得完全没用,你的SQL容易受到攻击。
因此,您可以保留当前的代码,但将来,只要您需要使用其他查询部分 - 您将需要以不同的方式格式化它。以下是一套完整规则:In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?
当然不要忘记密码!如果我有一个像wef5623'sdf
这样的密码 - 它永远不会让我进来!
顺便说一下,我不知道为什么你只使用了很多变量只有一个值 - $ _POST ['username'],$ username,$ uusername,$ ousername - 这是什么?
答案 1 :(得分:-3)
我会改变
$opassword = $password;
到
$opassword = mysql_real_escape_string($password);
sql注入也可以通过密码字段完成。