PHP记住Cookie中的登录状态
我想在我的网站上用PHP实现一个“记住我”的功能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
我的想法是将用户名和哈希密码字符串存储在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浏览器)
。