Защищенная Авторизация и Регистрация на PHP + MySQL через PDO

Защищенная Авторизация и Регистрация на PHP + MySQL через PDO
PHP скрипты 0    3300 0

В этой статье Вы найдете скрипт на языке программирования PHP, который позволяет пользователю зарегистрироваться и авторизоваться на сайте. Скрипт на 100% защищает от SQL-инжекций, поскольку использует PDO (система подготовленных запросов) и библиотеку RedBeanPHP, которая реализует ORM. Использовать RedBeanPHP мы будем только, чтобы присоединиться к базе данных и легко ей манипулировать, не используя стандартные команды в PHP, такие как mysql_connect и подобные, потому что они устаревшие и не очень эффективные.

Скрипт использует сессии ($_SESSION) и позволяет узнать авторизован сейчас человек или нет. Также в скрипте предусмотрена капча с рандомными вопросами, которая защищает сайт от надоедливого спама.

Скрипт состоит из следующих файлов:

  • index.php - содержит 2 ссылки (на форму авторизации и регистрации);
  • rb.php - ORM-библиотека RedBeanPHP;
  • db.php - подключение к базе данных;
  • login.php - обработчик авторизации пользователя и форма авторизации;
  • signup.php - обработчик регистрации пользователя и форма регистрации;
  • logout.php - выход из сессии.

Как подключить скрипт?

Скачайте готовый скрипт и перенесите все файлы на свой хостинг или локальный сервер (Denwer, OpenServer). Для работы скрипта Вам потребуется версия PHP не ниже 5.6. Далее необходимо создать базу данных и подсоединиться к ней. Для этого потребуется поменять значения в файле db.php. Если с этим возникнут трудности, то Вы можете задавать свои вопросы в комментариях под статьей.


Форма авторизации

В файле login.php находится обработчик и сама форма авторизации, которая состоит из двух полей (логин, пароль). Значок @ (собачка) перед переменными служит в PHP для отключения ошибки, если такая возникнет.

Логин
Пароль

PHP обработчик формы авторизации пользователя

Все переменные, которые возвращаются по методу POST - мы присваиваем переменной $data.

	$data = $_POST;
	if ( isset($data['do_login']) )
	{
		$user = R::findOne('users', 'login = ?', array($data['login']));
		if ( $user )
		{
			//логин существует
			if ( password_verify($data['password'], $user->password) )
			{
				//если пароль совпадает, то нужно авторизовать пользователя
				$_SESSION['logged_user'] = $user;
				echo '
Вы авторизованы!
Можете перейти на главную страницу.

'; }else { $errors[] = 'Неверно введен пароль!'; } }else { $errors[] = 'Пользователь с таким логином не найден!'; } if ( ! empty($errors) ) { //выводим ошибки авторизации echo '
' .array_shift($errors). '

'; } }

Форма регистрации

В файле signup.php находится обработчик и сама форма регистрации. Для таких форм рекомендуется использовать метод запроса POST, при котором веб-сервер принимает данные, заключённые в тело сообщения, для хранения.

Ваш логин
Ваш Email
Ваш пароль
Повторите пароль


PHP обработчик формы регистрации пользователя

	$data = $_POST;

	function captcha_show(){
		$questions = array(
			1 => 'Столица России',
			2 => 'Столица США',
			3 => '2 + 3',
			4 => '15 + 14',
			5 => '45 - 10',
			6 => '33 - 3'
		);
		$num = mt_rand( 1, count($questions) );
		$_SESSION['captcha'] = $num;
		echo $questions[$num];
	}

	//если кликнули на button
	if ( isset($data['do_signup']) )
	{
    // проверка формы на пустоту полей
		$errors = array();
		if ( trim($data['login']) == '' )
		{
			$errors[] = 'Введите логин';
		}

		if ( trim($data['email']) == '' )
		{
			$errors[] = 'Введите Email';
		}

		if ( $data['password'] == '' )
		{
			$errors[] = 'Введите пароль';
		}

		if ( $data['password_2'] != $data['password'] )
		{
			$errors[] = 'Повторный пароль введен не верно!';
		}

		//проверка на существование одинакового логина
		if ( R::count('users', "login = ?", array($data['login'])) > 0)
		{
			$errors[] = 'Пользователь с таким логином уже существует!';
		}
    
    //проверка на существование одинакового email
		if ( R::count('users', "email = ?", array($data['email'])) > 0)
		{
			$errors[] = 'Пользователь с таким Email уже существует!';
		}

		//проверка капчи
		$answers = array(
			1 => 'москва',
			2 => 'вашингтон',
			3 => '5',
			4 => '29',
			5 => '35',
			6 => '30'
		);
		if ( $_SESSION['captcha'] != array_search( mb_strtolower($_POST['captcha']), $answers ) )
		{
			$errors[] = 'Ответ на вопрос указан не верно!';
		}


		if ( empty($errors) )
		{
			//ошибок нет, теперь регистрируем
			$user = R::dispense('users');
			$user->login = $data['login'];
			$user->email = $data['email'];
			$user->password = password_hash($data['password'], PASSWORD_DEFAULT); 
			//пароль нельзя хранить в открытом виде, 
			//мы его шифруем при помощи функции password_hash для php > 5.6
			
			R::store($user);
			echo '
Вы успешно зарегистрированы!

'; }else { echo '
' .array_shift($errors). '

'; } }

Смотреть видеоурок

Статья была написана на основе видеоурока Хауди Хо, который Вы можете посмотреть ниже. Скрипт из видео был немного доработан (добавлена капча function captcha_show).


Похожие статьи:

Удобная форма обратной связи без перезагрузки страницы
Счетчик онлайн посетителей на сайте
Пишем на SQL без SQL: основы по RedBean PHP
Универсальный и очень простой PHP парсер

Комментарии ()

  1. Роман Дубровский 11 февраля 2018, 19:03 # +1
    Простите, не очень понял. Какой код должен быть на странице с закрытым контентом?

    Уже понял. Содержание страницы надо расположить между <?php if… и <?php else: ?>
    1. Алексей Власов 24 мая 2018, 23:48 # 0
      Спасибо за комментарий! Всё верно.
    2. Виталий Алехин 29 марта 2018, 19:38 # +1
      1)<strong><!--?php captcha_show(); ?--></strong> <input type="text" name="captcha"> — ошибка в описании статьи: комментарии здесь не нужны
      2)$errors[] = 'Ответ на вопрос указан не верно!'; var_dump($answers); — опять же непонятно для чего тут в статье и в файле нужен
      var_dump($answers);
      С уважением,
      Виталий
      1. Алексей Власов 24 мая 2018, 23:54 # 0
        Спасибо за помощь!

        var_dump действительно не нужен, забыл удалить его после тестов. В архиве и статье исправил.

        «ошибка в описании статьи: комментарии здесь не нужны» — комментарии создал плагин, убрать их статьи не получится, так как там симбиоз html и php кода. Люди, которые это читают, — смело качайте архив, там нет ничего лишнего. Всё исправно работает!
      2. Victor Sproot 06 июля 2018, 21:51 # 0
        скрипт хороший спасибо
        вот только как защитить его от перебора паролей, а самое главное как сделать чтоб на страницу которую входишь после авторизации можно бы было попасть только авторизованным а то иначе если ввесли в строке адрес то можно без труда туда попасть
        1. Victor Sproot 06 июля 2018, 22:39 # 0
          ну с тем чтоб не открывалось для неавторизованных я разобрался тем что впихнул всю страницу в if
          а вот как с перебором бороться?
          1. Алексей Власов 12 июля 2018, 10:33 # 0
            Спасибо за комментарий! Можно писать в сессию число попыток и если перевалит за какое-то число, то выводить рекапчу гугловскую, например или просто блокировать.

          Вы должны авторизоваться, чтобы оставлять комментарии.

          Вы можете авторизоваться на сайте через:
          YandexVkontakte