PHP记住Cookie中的登录状态

PHP记住Cookie中的登录状态,php,session,web,cookies,remember-me,Php,Session,Web,Cookies,Remember Me,我想在我的网站上用PHP实现一个“记住我”的功能 我的想法是将用户名和哈希密码字符串存储在cookies中。但是任何人仍然可以获取cookie的值,并从另一台计算机(使用浏览器的调试控制台)设置cookie以重新加载页面并登录,对吗?如何防止这种情况?以下是防止这种情况的代码: 创建Cookie: $customer_id = 1; $client_ip = '127.0.0.1'; $tokenSave = ['code'=>string_encrypt($cus

我想在我的网站上用PHP实现一个“记住我”的功能


我的想法是将用户名和哈希密码字符串存储在cookies中。但是任何人仍然可以获取cookie的值,并从另一台计算机(使用浏览器的调试控制台)设置cookie以重新加载页面并登录,对吗?如何防止这种情况?

以下是防止这种情况的代码:

创建Cookie:

    $customer_id = 1;
    $client_ip = '127.0.0.1';
    $tokenSave = ['code'=>string_encrypt($customer_id.'+'.$client_ip.'+'.$_SERVER['HTTP_USER_AGENT']),'created'=>date('Y-m-d H:i:s')];
   setcookie(
         'loggedIn',
         serialize($tokenSave),
         time() + (10 * 365 * 24 * 60 * 60)
  ); 
验证Cookie中的日志

$loggedIn = isset($_COOKIE['loggedIn'])?unserialize($_COOKIE['loggedIn'], ["allowed_classes" => false]):NULL;
        if(!empty($loggedIn)){
            $decypted = string_decrypt($loggedIn['code']);
            $realInfo = explode('+', $decypted);
            $savedId = $realInfo[0];
            $savedIp = $realInfo[1];
            $savedUserAgent = $realInfo[2];
            if($_SERVER['HTTP_USER_AGENT'] != $savedUserAgent && $savedIp != $this->get_client_ip()){
                 //Redirect to 404
            }
       }
function string_encrypt($string = '') {
    return rtrim(strtr(base64_encode(@mcrypt_encrypt(
        MCRYPT_BLOWFISH,
        md5('sadsjdjaASajahj1233232SA', TRUE),
        utf8_encode($string),
        MCRYPT_MODE_ECB
    )), '+/', '-_'), '=');
}

function string_decrypt($string = '') {
    return str_replace("\000", '', @mcrypt_decrypt(
        MCRYPT_BLOWFISH,
        md5('sadsjdjaASajahj1233232SA', TRUE),
        base64_decode(str_pad(
            strtr($string, '-_', '+/'),
            strlen($string) % 4,
            '=',
            STR_PAD_RIGHT
        )),
        MCRYPT_MODE_ECB
    ));
}
加密和解密代码的函数

$loggedIn = isset($_COOKIE['loggedIn'])?unserialize($_COOKIE['loggedIn'], ["allowed_classes" => false]):NULL;
        if(!empty($loggedIn)){
            $decypted = string_decrypt($loggedIn['code']);
            $realInfo = explode('+', $decypted);
            $savedId = $realInfo[0];
            $savedIp = $realInfo[1];
            $savedUserAgent = $realInfo[2];
            if($_SERVER['HTTP_USER_AGENT'] != $savedUserAgent && $savedIp != $this->get_client_ip()){
                 //Redirect to 404
            }
       }
function string_encrypt($string = '') {
    return rtrim(strtr(base64_encode(@mcrypt_encrypt(
        MCRYPT_BLOWFISH,
        md5('sadsjdjaASajahj1233232SA', TRUE),
        utf8_encode($string),
        MCRYPT_MODE_ECB
    )), '+/', '-_'), '=');
}

function string_decrypt($string = '') {
    return str_replace("\000", '', @mcrypt_decrypt(
        MCRYPT_BLOWFISH,
        md5('sadsjdjaASajahj1233232SA', TRUE),
        base64_decode(str_pad(
            strtr($string, '-_', '+/'),
            strlen($string) % 4,
            '=',
            STR_PAD_RIGHT
        )),
        MCRYPT_MODE_ECB
    ));
}

下面是防止它的代码:

创建Cookie:

    $customer_id = 1;
    $client_ip = '127.0.0.1';
    $tokenSave = ['code'=>string_encrypt($customer_id.'+'.$client_ip.'+'.$_SERVER['HTTP_USER_AGENT']),'created'=>date('Y-m-d H:i:s')];
   setcookie(
         'loggedIn',
         serialize($tokenSave),
         time() + (10 * 365 * 24 * 60 * 60)
  ); 
验证Cookie中的日志

$loggedIn = isset($_COOKIE['loggedIn'])?unserialize($_COOKIE['loggedIn'], ["allowed_classes" => false]):NULL;
        if(!empty($loggedIn)){
            $decypted = string_decrypt($loggedIn['code']);
            $realInfo = explode('+', $decypted);
            $savedId = $realInfo[0];
            $savedIp = $realInfo[1];
            $savedUserAgent = $realInfo[2];
            if($_SERVER['HTTP_USER_AGENT'] != $savedUserAgent && $savedIp != $this->get_client_ip()){
                 //Redirect to 404
            }
       }
function string_encrypt($string = '') {
    return rtrim(strtr(base64_encode(@mcrypt_encrypt(
        MCRYPT_BLOWFISH,
        md5('sadsjdjaASajahj1233232SA', TRUE),
        utf8_encode($string),
        MCRYPT_MODE_ECB
    )), '+/', '-_'), '=');
}

function string_decrypt($string = '') {
    return str_replace("\000", '', @mcrypt_decrypt(
        MCRYPT_BLOWFISH,
        md5('sadsjdjaASajahj1233232SA', TRUE),
        base64_decode(str_pad(
            strtr($string, '-_', '+/'),
            strlen($string) % 4,
            '=',
            STR_PAD_RIGHT
        )),
        MCRYPT_MODE_ECB
    ));
}
加密和解密代码的函数

$loggedIn = isset($_COOKIE['loggedIn'])?unserialize($_COOKIE['loggedIn'], ["allowed_classes" => false]):NULL;
        if(!empty($loggedIn)){
            $decypted = string_decrypt($loggedIn['code']);
            $realInfo = explode('+', $decypted);
            $savedId = $realInfo[0];
            $savedIp = $realInfo[1];
            $savedUserAgent = $realInfo[2];
            if($_SERVER['HTTP_USER_AGENT'] != $savedUserAgent && $savedIp != $this->get_client_ip()){
                 //Redirect to 404
            }
       }
function string_encrypt($string = '') {
    return rtrim(strtr(base64_encode(@mcrypt_encrypt(
        MCRYPT_BLOWFISH,
        md5('sadsjdjaASajahj1233232SA', TRUE),
        utf8_encode($string),
        MCRYPT_MODE_ECB
    )), '+/', '-_'), '=');
}

function string_decrypt($string = '') {
    return str_replace("\000", '', @mcrypt_decrypt(
        MCRYPT_BLOWFISH,
        md5('sadsjdjaASajahj1233232SA', TRUE),
        base64_decode(str_pad(
            strtr($string, '-_', '+/'),
            strlen($string) % 4,
            '=',
            STR_PAD_RIGHT
        )),
        MCRYPT_MODE_ECB
    ));
}

也许您可以使用某种密钥加密算法(如AES())来保存它,方法是使用原始密码散列进行加密,该散列使用的密钥不能被其他浏览器(如某些浏览器数据)使用。检查或$\u服务器['HTTP\u用户\u代理']
这不会避免有人在另一个浏览器中使用具有确切属性的同一cookie,但您可以找到一种混合一些变量的方法

也许您可以使用某种密钥加密算法(如AES())保存它,方法是使用原始密码哈希进行加密,该哈希使用的密钥不能被其他浏览器(如某些浏览器数据)使用。检查或$\u服务器['HTTP\u用户\u代理']
这不会避免有人在另一个浏览器中使用具有确切属性的同一cookie,但您可以找到一种混合一些变量的方法

在cookies中保存数据之前使用一些加密方法您必须在服务器端保存数据,使用会话而不是cookies:@sochas但会话的数据将在客户端关闭浏览器后消失在cookies中保存数据之前使用一些加密方法您必须在服务器端保存数据,使用会话而不是cookie:@sochas,但会话数据在客户端关闭浏览器后将消失EW,mcrypt已被弃用,并且大多数用户代理包含
+
,因此我认为关键是将ip和用户代理打包到cookie中,谢谢。eww,mcrypt已弃用,大多数用户代理包含
+
,因此,我认为关键是将ip和用户代理打包到cookie中,谢谢。但是用户代理似乎很容易被客户端伪造(根据)是的,用户代理可以被任何用户更改,但是“黑客”不知道您使用什么变量将哈希加密到cookie值中(他/她也不知道您使用的算法)。如果您的AES密钥是
使用用户代理+平台(从get\u浏览器)+浏览器\u name\u regex(从get\u浏览器)
,人们将很难知道您密钥的值。但是用户代理似乎很容易被客户端伪造(根据)是的,用户代理可以被任何用户更改,但“黑客”不知道您使用哪些变量将哈希加密到cookie值中(他/她也不知道您使用的算法)。如果您的AES密钥是
use user agent+platform(从get\u浏览器)+browser\u name\u regex(从get\u浏览器)