Вход по паролю на PHP и авторизация через куки


Иногда мне приходится объяснять принцип работы с куками на разных языках программирования, и нередко это кажется сложным для новичков. На самом деле ничего сложного нет. В этой статье я приведу рабочий пример работы с куками на PHP и авторизации для сайта. Бонусом мы подключим защиту от взлома – рекапчу от гугла.

Итак, вам для чего-то понравилось закрыть доступ к некоторому содержимому на сайте, предположим странице админки. Самый простой способ – это его запаролить. Раньше я нередко использовал для решения данной задачи файл .htaccess – отлично работает для предотвращения несанкционированного доступа к целому сайту или определённой директории. Но у htaccess есть некоторые проблемы переносимости, а также не самая простая процедура смены пароля-логина. Не говоря уж о масштабируемости и мультдоступе.

Так что давайте создадим вход по логину и запоминание целиком на PHP и куках. Код:

if (isset($_COOKIE["pass"]) && $_COOKIE["pass"]==$pass){
Сначала проверяем, существует ли кука с названием “pass” и равна ли она некоему значению. Сразу скажу: хранить пароль в открытом виде небезопасно, используйте хотя бы md5 шифрование с солью. Далее, если все хорошо, то что-то делаем или показываем, а вот дальше подключаем рекапчу:

else {
?>
<script src='https://www.google.com/recaptcha/api.js'></script>
<form action="<?php echo $_SERVER["PHP_SELF"];?>" method="POST">
<input name="password" type="password" size="45"/>
<input class="submit" type="submit" value="Войти"/>
<div class="g-recaptcha" data-sitekey="публичный_ключ "></div>
</form>
Обработку формы ведем на той же странице, так что если есть пост-запрос:

if (isset($_POST["password"])) {
	получаем ответ от капчи
	$recaptcha=$_POST['g-recaptcha-response'];	
	if(!empty($recaptcha)){
		$google_url="https://www.google.com/recaptcha/api/siteverify";
		$secret="секретный_ключ";
		$ip=$_SERVER['REMOTE_ADDR'];
		$url=$google_url."?secret=".$secret."&response=".$recaptcha."&remoteip=".$ip;
Инициализируем curl и выполняем исходящее соединение:

$curl = curl_init();
curl_setopt($curl,CURLOPT_URL, $url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$res = curl_exec($curl);
curl_close($curl);
$res = json_decode($res, true);
Если капча пройдена:

if ($res['success'])  {
Если пароль верен:

$valid = password_verify($password, $stored_hash);
if (!$valid) {
  throw new UnauthorizedException('Invalid password!');
}
Ставим куки на месяц

setcookie("pass", $pass, time()+60*60*24*30);
И обновляем страничку:

header ("Location: ".$_SERVER["PHP_SELF"]);
exit();
Просто, не правда ли?
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, авторизация, куки, пароли




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Ошибки 500 (internal server error) и 550 (permission denied)
Введение в модульное тестирование на C#
Настоящий случайный сайт