MySQLi:这是安全的登录系统吗?

时间:2017-10-22 12:59:22

标签: php mysql security mysqli login

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $login = $_POST['login'];
    $password = $_POST['password'];

    //if(isset($login) && isset($password)) {
    if((isset($login) && isset($password)) && preg_match('/^[a-z0-9\-\_]+$/i', $login)) {
        if($result = $db->query("SELECT * FROM `users` WHERE `username`='{$login}'")) {
            if($count = $result->num_rows) {
                while($row = $result->fetch_object()) {
                    $user_name = $row->username;
                    $user_password = $row->password;

                    if(password_verify($password, $user_password)) {
                        setcookie('u_log', $user_name);
                        $_COOKIE['u_log'] = $user_name;
                        setcookie('u_pass', $user_password);
                        $_COOKIE['u_pass'] = $user_password;

                        header("Location: /user/$user_name");
                    } else { $error = 1; $err_message = 'Неверный логин или пароль.'; }
                }
            } else { $error = 1; $err_message = 'Неверный логин или пароль.'; }
        } else { $error = 1; $err_message = 'Неверный логин или пароль.'; }
    }
}

我知道我需要在用户输入中转义单引号和双引号,但不知道这是否是完全安全的解决方案,因为有些命令可以执行。有人可以分析我的代码并描述我需要做什么吗?

几乎在顶部改变了代码。现在它应该更安全吗?

1 个答案:

答案 0 :(得分:3)

安全的?

  • 关于密码哈希和验证,几乎。查找password_needs_rehash()并使用它。
  • 至于SQL注入,。使用参数化查询。
  • 关于cookies,。您的sesssion cookie应该设置httpOnly和安全标志。查看php手册中的最后一个two parameters of setcookie()
  • 至于将用户密码的纯文本放入Cookie中,不,不,千次否!在Cookie中使用难以猜测的会话ID,不是一个高价值的秘密。与密码相比,会话ID是临时的。