TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码
/
注册
用户名
邮箱

PHP cookie加密登录与验证

2022-10-19
/
0 评论
/
729 阅读
/
正在检测是否收录...
10/19
<?php
/**
 * cookie加密登录与验证
 * @param array $userInfo 用户信息
 * @param bool|string $validate 是否为验证或者填入token值验证,填入data为返回用户信息,默认为false
 * @param int $expiresTime 过期时间,默认为1天
 * @param string $tag token标签,默认为zz_token
 * @return bool|string
 */
function zz_login($userInfo, $validate = false, $expiresTime = 1, $tag = 'zz_token')
{
    $salt = zz_salt();
    $host = $_SERVER['HTTP_HOST'];
    if (!$salt) {
        return false;
    }
    if (!$validate) {
        try {
            $expiresTime = time() + 3600 * 24 * $expiresTime;
            $token = aes_encrypt(json_encode(['userInfo' => $userInfo, 'domain' => $host, 'expiresTime' => $expiresTime, 'code' => md5(json_encode($userInfo) . $host . $expiresTime . $salt)]),$salt);
            setcookie($tag, $token, $expiresTime, '/');
            return $token;
        } catch (Exception $e) {
            return false;
        }
    } else {
        if ($validate === true) {
            if (empty($_COOKIE[$tag])) {
                return false;
            }
            $arr = json_decode(aes_decrypt($_COOKIE[$tag],$salt), true);
        } else if ($validate === 'data') {
            if (empty($_COOKIE[$tag])) {
                return false;
            }
            $arr = json_decode(aes_decrypt($_COOKIE[$tag],$salt), true);
            return $arr['userInfo'] ?? [];
        } else {
            $arr = json_decode(aes_decrypt($validate,$salt), true);
        }
        if (empty($arr['userInfo']) || empty($arr['domain']) || $arr['domain'] !== $host || empty($arr['code']) || empty($arr['expiresTime']) || $arr['expiresTime'] <= time()) {
            return false;
        }
        return $arr['code'] === md5(json_encode($arr['userInfo']) . $host . $arr['expiresTime'] . $salt);
    }
    return true;
}

/**
 * 生成安全码
 * @return string
 */
function zz_salt()
{
    $root = $_SERVER['DOCUMENT_ROOT'];
    $file = $root . '/salt.php';
    if (is_file($file)) {
        if(!defined('IN_SALT')){
            define('IN_SALT',true);
        }
        include($file);
        if (empty($salt) || empty($saltRoot) || $saltRoot !== $root) {
            $salt = rand_str(32, true);
            file_put_contents($file, "<?php \r\nif(!defined('IN_SALT')){\r\n\texit;\r\n}\r\n\$salt = '{$salt}';\r\n\$saltRoot = '{$root}';");
        }
    } else {
        $salt = rand_str(32, true);
        file_put_contents($file, "<?php \r\nif(!defined('IN_SALT')){\r\n\texit;\r\n}\r\n\$salt = '{$salt}';\r\n\$saltRoot = '{$root}';");
    }
    return $salt;
}

/**
 * AES-256-CBC加密
 * @param string $data 明文数据
 * @param string $key 加密密钥(需满足长度要求)
 * @return string base64编码的密文(含IV)
 */
function aes_encrypt($data, $key)
{
    $iv = openssl_random_pseudo_bytes(16);  // 生成16字节随机IV
    $encrypted = openssl_encrypt(
        $data,
        'AES-256-CBC',
        $key,
        OPENSSL_RAW_DATA,
        $iv
    );
    return base64_encode($iv . $encrypted);  // IV与密文合并编码
}

/**
 * AES-256-CBC解密
 * @param string $encryptedData base64编码的密文(含IV)
 * @param string $key 加密密钥
 * @return string|false 解密后的明文
 */
function aes_decrypt($encryptedData, $key)
{
    $data = base64_decode($encryptedData);
    $iv = substr($data, 0, 16);  // 提取前16字节作为IV‌
    $ciphertext = substr($data, 16);
    return openssl_decrypt(
        $ciphertext,
        'AES-256-CBC',
        $key,
        OPENSSL_RAW_DATA,
        $iv
    );
}

/**
 * 生成随机字符串
 * @param int $num 
 * @param bool $special
 * @return string 
 */
function rand_str($num = 6, $special = false)
{
    $str = 'abcedfghjkmnpqrstuvwxyzABCEDFGHJKMNPQRSTUVWXYZ0123456789';
    if ($special) {
        $str .= '!@#$%^&*';
    }
    if (strlen($str) < $num) {
        $str = $str . $str;
    }
    return substr(str_shuffle($str), 0, $num);
}

// 登录
$userInfo = ['id' => 1,'username' => 'admin'];
zz_login($userInfo);

// 验证
if(zz_login('',true)){
    echo '登录';
}else{
    echo '未登录';
}

// 获取用户信息
$arr = zz_login('','data');
print_r($arr);
经验PHPcookie用户登录
朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/6366/(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 强强强
    2025-04-07
  2. jesse
    2025-01-16
  3. sowxkkxwwk
    2024-11-20
  4. zpzscldkea
    2024-11-20
  5. bruvoaaiju
    2024-11-14

标签云