PHP会话登录记住我

Exo*_*oon 25 php login

我有一个使用PHP会话的PHP注册/登录系统,它工作得很好,我希望用户能够记住我,然后他们会永远登录或至少一周或某事.

我猜我需要存储一个cookie并检查,我对我实际需要存储在cookie中的内容感到困惑.如果我存储用户标识或用户名,那么有人只能使用假cookie来查看其他用户数据吗?

任何进步都表示赞赏.

Luk*_*uke 26

您需要做的就是扩展PHP会话cookie.以下示例将cookie扩展30天:

$params = session_get_cookie_params();
setcookie(session_name(), $_COOKIE[session_name()], time() + 60*60*24*30, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
Run Code Online (Sandbox Code Playgroud)

我认为,根据您的安全问题,您只关心设置容易被黑客攻击的值.PHP会话cookie具有随机值并将其内容存储在文件系统上,因此您应该没问题.

  • Chrome限制HTTP Cookie只能持续一定时间长度,无论设置的到期日期如何。Firefox现在正在遵循Chrome的行为。HTTPS cookie不受影响。 (2认同)

Gus*_*nez 17

登录成功后:

$_SESSION['user_is_loggedin'] = 1;

$cookiehash = md5(sha1(username . user_ip));
setcookie("uname",$cookiehash,time()+3600*24*365,'/','.yoursite.com');
Run Code Online (Sandbox Code Playgroud)

存储在sql中:

$sql = "UPDATE `users` SET `login_session`='$cookiehash' WHERE `user_id`='$uid'";
Run Code Online (Sandbox Code Playgroud)

检查用户是否登录:

function CheckCookieLogin() {
    $uname = $_COOKIE['uname']; 
    if (!empty($uname)) {   
        $sql = "SELECT * FROM `users` WHERE `login_session`='$uname'";
        $_SESSION['user_is_loggedin'] = 1;
        $_SESSION['cookie'] = $uname;
        // reset expiry date
        setcookie("uname",$uname,time()+3600*24*365,'/','.yoursite.com');
    }
}

if(!isset($_SESSION['cookie']) && empty($_SESSION['user_is_loggedin'])) {
    CheckCookieLogin();
}
Run Code Online (Sandbox Code Playgroud)

  • 你应该指出你的SQL仅仅是因为你不应该直接在SQL中插入变量(=> SQL Injection). (10认同)
  • 请注意,因为PHP 5.5有一个`password_hash()`,可能可以用来代替`md5(sha1())`. (4认同)
  • 如果这样做,则无法登录多个浏览器/设备. (3认同)

Jul*_*ien -6

我经常使用的小例子

function setSession($username,$password,$cookie=null){
    // Other code for login ($_POST[]....)
    // $row is result of your sql query
    $values = array($username,$this->obscure($password),$row['id']);         
    $session = implode(",",$values);

    // check if cookie is enable for login
    if($cookie=='on'){
        setcookie("your_cookie_name", $session, time()+60*60*24*100,'/');
    } else {
        $_SESSION["your_session_name"] = $session;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `your_cookie_name` 将存储隐藏的密码...我猜如果有人窃取 cookie 就会窃取这个“哈希”...假设您使用 mcrypt 进行密码哈希...它也会包含盐...所以,现在你已经将哈希和盐给了攻击者,现在可以进行字典攻击...我认为你永远不应该将用户的密码存储在 cookie 中...**永远** (9认同)
  • 这个答案是完全不完整的。$session 变量的值是多少??? (7认同)
  • 这个答案是一个非常糟糕的尝试。“记住我”功能绝对不应该通过存储用户密码来实现。(甚至不是哈希值)此外,如果用户更改密码,功能就会中断。延长会话 cookie 的生命周期是实现这一目标的更好、更安全的方法。 (3认同)
  • 这里接受的答案很糟糕。万一 Google 员工发现了这个并实现了它,有人愿意重写吗? (2认同)