Сохранение авторизации

dr-sm

Новичок
Re: Сохранение авторизации

Автор оригинала: 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
только стоит помнить, что если юзер зашел на сайт по куке и полез чарджить кредитку, то лучше, все-таки, спросить у него пароль ).
 

zerkms

TDD infected
Команда форума
приветствуются замечания и предложения.
для $ct при генерации HASH_SIZE не учитывается, а при проверке учитывается
сделай 20 вместо 32 и всё перестанет работать
 

dr-sm

Новичок
о, точно, спасибо!
завернул HASH_SIZE в класс вместе с md5 ).
 
Сверху