dr-sm
Новичок
Re: Сохранение авторизации
давно я здесь небыл, а вопросы все теже ), может в фак, этоже ппц.
сегодня, после долгого разговора со своим ямайским дедушкой, я все-таки решился реализовать эту фичу в текущем проекте )).
для того чтобы проверить куку на валидность, соединение с базой естественно не нужно.
вот что у меня получилось, вроде работает )) :
приветствуются замечания и предложения.
PS
только стоит помнить, что если юзер зашел на сайт по куке и полез чарджить кредитку, то лучше, все-таки, спросить у него пароль ).
да куки.Автор оригинала: fire-one
Доброго времени суток
На своем сайте я осуществляю авторизацию пользователей с помощью сессий (сохраняю в переменных имя пользователя и пароль и результат авторизации 1/0)
Сессия обнуляется если не обновлять страницы некоторое время (кстати, какое ?)
Чтобы сохранять авторизацию на более длительные сроки чем нужно пользоваться ?
Куки ?
давно я здесь небыл, а вопросы все теже ), может в фак, этоже ппц.
сегодня, после долгого разговора со своим ямайским дедушкой, я все-таки решился реализовать эту фичу в текущем проекте )).
для того чтобы проверить куку на валидность, соединение с базой естественно не нужно.
вот что у меня получилось, вроде работает )) :
PHP:
define('HASH_SIZE', 32); // md5 in hex
$secret = 'top secret random string';
// эти данные лежат в сессии, по ним мы логиним пользователя
// userID
$uid = 2;
// password hash - md5($pwdPlainText . $salt) . ':' . $salt
$pwd = 'e266fc914f8164d5671db2b2381c7bb9:3469';
function generateAuthCookie($uid, $pwd, $bind2IP) {
global $secret;
// auth part
$ap = (int)$uid . ':' . substr($pwd, 0, HASH_SIZE);
// check token
$ct = md5($secret . $ap . ($bind2IP ? $_SERVER['REMOTE_ADDR'] : ''));
return $ap . ':' . $ct;
}
function checkAuthCookie($cookie) {
global $secret;
$tmp = explode(':', $cookie); // UID:PWD:TKN
// doing some sanity checks
if ((3 != count($tmp))
|| (HASH_SIZE != strlen($tmp[1]))
|| (HASH_SIZE != strlen($tmp[2]))) {
// failed, bad format
return false;
}
$tmp[0] = (int)$tmp[0];
if ($tmp[0] <= 0) {
// failed, bad format
return false;
}
if ($tmp[2] == md5($secret . $tmp[0] . ':' . $tmp[1])) {
// success
return array($tmp[0], $tmp[1], 0);
}
if ($tmp[2] == md5($secret . $tmp[0] . ':' . $tmp[1] . $_SERVER['REMOTE_ADDR'])) {
// success, bind2IP
return array($tmp[0], $tmp[1], 1);
}
// failed
return false;
}
echo '<pre>';
$c1 = generateAuthCookie($uid, $pwd, true);
$c2 = generateAuthCookie($uid, $pwd, false);
echo $c1 . "\n";
echo $c2 . "\n";
print_r(checkAuthCookie($c1));
print_r(checkAuthCookie($c2));
$c3 = strtr($c1, 'adcdef', 'fedcba');
$c4 = strtr($c2, 'adcdef', 'fedcba');
echo $c3 . "\n";
echo $c4 . "\n";
var_dump(checkAuthCookie($c3));
var_dump(checkAuthCookie($c4));
echo '</pre>';
PS
только стоит помнить, что если юзер зашел на сайт по куке и полез чарджить кредитку, то лучше, все-таки, спросить у него пароль ).