繁体   English   中英

PHP此代码安全吗?

[英]PHP is this code secure?

在关于S O 的上一个问题中找到了以下代码。在以下代码中,如果用户提供的用户名和密码正确,则user_id和用户名存储在会话中以保持记录。 我的问题是, 为什么需要在会话中保留user_id? 仅一件事(例如,用户名)足以存储在会话中吗? 如果启用了记住功能,则将设置cookie,仅使用用户名。 现在我的问题是,仅用户名cookie是否足够? 有人不能在浏览器中编辑或添加cookie并登录系统吗?

多谢您的回覆。

<?
public function login($username, $pass, $remember) {
    // check username and password with db
        $result = $conn->query("select * from login where
                            username='".$username."' and
                           password=sha1('".$pass."')");
        if (!$result) {
            throw new depException('Incorrect username and password combination. Please try again.');
        } 

       if ($result->num_rows>0) {
            $row = $result->fetch_assoc();
            $_SESSION['user_id'] = $row[user_id];
            $_SESSION['username'] = $username;

           // start rememberMe
            $cookie_name = 'db_auth';
            $cookie_time = (3600 * 24 * 30);*/ // 30 days

            // check to see if user checked box
            if ($remember) {
            setcookie ($cookie_name, 'username='.$username, time()+$cookie_time);
            }

            // If all goes well redirect user to their homepage.
            header('Location: http://localhost/v6/home/index.php'); 
            } else {
           throw new depException('Could not log you in.');
            }
    }

?>

此代码不安全! (对大写字母表示抱歉,但对重点内容表示抱歉)。 SQL语句容易受到SQL注入的影响。 将用户名也存储在cookie中不是一个好主意,因为任何人都可以伪造cookie以获得身份验证。

我对这个问题是否安全的回答:不。

您需要清理代码。 如果有人输入“ test OR 1 = 1”作为用户名怎么办?

我真的不知道从哪里开始。 此代码确实不安全。

  • 您应该使用mysql_real_escape_string() (或mysqli函数,甚至更好:使用PDO进行任何数据库连接并使用准备好的语句),用户名和密码进行消毒,并确保$remember为布尔值或整数。
  • sha1有点坏,所以我建议改用md5
  • 用户可以重写Cookie,该用户可以在cookie中添加username=admin并以admin身份登录。

您的代码不安全。

您的数据可以通过初始查询进行SQL注入,其中,根据数据库用户的访问级别,可以让任何人登录。您需要清理输入。

其次,通过cookie对网站的访问以及其中的用户名是否与他们获得的访问级别和特权有关? 如果是这样的话,那么当前会话很容易被劫持。

这是我用来确保一切都安全的代码。它可能不是最安全的,但是我还使用其他措施来验证安全登录。 但是此代码将保护您免受SQL注入。

function secure($data) {
    $data = trim(htmlentities(strip_tags($data)));

    if (get_magic_quotes_gpc())
        $data = stripslashes($data);

    $data = mysql_real_escape_string($data);

    return $data;
}

它的用法

 secure($username);

例如

foreach($_POST as $key => $value) {
    $get[$key] = secure($value); 
}

这告诉PHP为每个POST值保护它。 您也可以通过使用$ _GET而不是$ _POST来将其用于发布,但是让我们面对现实吧..使用GET命令进行登录真的很愚蠢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM