-2

这是我第一个使用 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>';
}           
?>

我之前在我的高分脚本上遇到过 SQL 注入,所以我想知道我的简单会话登录脚本是否有,我 40% 有一个。通常是什么导致 SQL 注入?谢谢!

4

2 回答 2

1

尽管您的代码还可以,但您的保护想法是错误的
mysql_real_escape_string 不能防止注入。它确实格式化字符串。 只要您的字符串格式正确,它们就是安全的。

当您尝试使用相同的函数来格式化非字符串(例如数字)时,问题就开始了。
它变得完全没用,并且您的 SQL 易受攻击。

因此,您可以保留当前代码,但在将来,只要您需要使用另一个查询部分 - 您将需要以不同的方式对其进行格式化。这是一组完整的规则:在 PHP 中,当向数据库提交字符串时,我应该使用 htmlspecialchars() 处理非法字符还是使用正则表达式?

当然不要逃避密码!如果我有这样的密码wef5623'sdf- 它永远不会让我进入!

顺便说一句,我不知道你为什么只为一个值使用这么多变量 - $_POST['username'], $username, $uusername, $ousername - 这是什么?

于 2013-02-22T05:10:25.080 回答
-3

我会改变 $opassword = $password;

 $opassword = mysql_real_escape_string($password);

sql注入也可以通过密码字段完成。

于 2013-02-22T03:34:18.650 回答