Найти тему
bestprogramm.site

Реализация регистрации на PHP 5.6 с reCAPTCHA2.0

Оглавление

Вступление

Я думаю, что многие хотят получить систему регистрации, хотя бы на PHP5.6. Но лишь мало кто знает, что есть форумы, видео уроки (бесплатные). Благодаря всему выше перечисленному мне удалось собрать регистрацию на PHP5.6 и в настоящее время у меня есть полноценная регистрация на PHP7.1 и драйверах PDO. Пока что, я не буду раскрывать её секреты, но дам подсказку, где найти информацию в конце статьи. А пока приступаем к реализации на PHP5.6.

Кстати, в принципе данная статья распространяется на версии PHP:
  • PHP 5.2
  • PHP 5.3
  • PHP 5.4
  • PHP 5.5
  • PHP 5.6
  • PHP 5.7

коды приведенные в данной статье должны работать до PHP 7

I-й этап реализации

Для реализации Вам понадобится phpMyAdmin, лучше последней версии, но если на хостинге нет возможности перехода, то сгодится phpMyAdmin 4.6.6 или phpMyAdmin 4.7.0 .

Итак, первым делом мы подключим файл DataBaze.php , который должен соединить нас с базой данных. Его исходник я привожу ниже:

                                                                 Файл DataBaze.php
Файл DataBaze.php

Подключать его мы будем в фале обработчике регистрации, который будет называться, например reg.php. Для этого пропишем первые 2-4 строки:

<?php

include "DataBaze.php"; //файлы обработчиков в одной директории

session_start(); //активация сессии, нужно при разработке авторизации

header("Сontent-type: text/html; charset=utf-8"); //кодировка UTF-8

Для дальнейшей работы Вам понадобится понять, что такое директория, сессия, кодировка, UTF-8. Для этого я приведу цитаты из Википедии и дам ссылку на определения

Директория (транслитерация англ. directory) — каталог файловой системы.
Каталог — объект в файловой системе, упрощающий организацию файлов.

Однако, что это за сессии такие. Определения в Википедедии даже толкового нет. Поможет нам другой сайт www.php.su . Итак, цитирую понятия сессия

Сессия- это механизм, позволяющий однозначно идентифицировать браузер и создающий для этого браузера файл на сервере, в котором хранятся переменные сеанса.
Ссылка на полную версию статьи: http://www.php.su/articles/?cat=examples&page=070
UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования текста, позволяющий более компактно хранить и передавать символыЮникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII.
Ссылка на полную версию статьи: https://ru.wikipedia.org/wiki/UTF-8

Теперь нам необходимо наладить механизмы работы, ReCAPTCHA 2.0 от Google. Постараюсь быть понятливым, т.к над работой с ней у меня ушли месяцы. Это будет уже второй этап реализации.

II-й этап реализации

По скольку код регистрации несколько раз обновлялся, то, что бы добиться максимальной "синхронности " без побочных эффектов, мне пришлось уступить немного памяти создав переменную $passed и присвоил значение false. Для дальнейшей работы нам понадобятся ключи, которые можно получить на официальном сайте reCAPTCHA2.0(идентифицирует себя как reCAPTCHA) .

                                                            Главный вид страницы reCAPTCHA от Google
Главный вид страницы reCAPTCHA от Google

Нам понадобится форма, которая расположена под разделом "Ваши сайты reCAPTCHA". Выглядит он следующим образом:

-3

Вводим данные в форму. Название сайта, в моем случае лучше прописать Программирование, а в Вашем... . Ну даже не знаю... Нравится космос, пишите "Космос". В общем это дело каждого, про что его сайт и конечно же будет ли на сайте регистрация. Выбираем тип reCAPTCHA -> reCAPTCHA V2. Нажимаем кнопку "Регистрация". Нам дают два ключа с названиями "внешний" и "секретный".

                                                           Интеграция на стороне клиента reCAPTCHA
Интеграция на стороне клиента reCAPTCHA

Шаг 1. Предельно ясен и над его реализацией у меня ушло всего-то минут пять, если не меньше. Но второй шаг меня шокировал. Толком, до сих пор, документация Google для меня самая темная . Вот, то что нужно сделать в файле PHP:

                   Указания Google, для интеграции reCAPTCHA на стороне сервера
Указания Google, для интеграции reCAPTCHA на стороне сервера

Теперь я должен облегчить задачу другим. Пишем код дальше...

<?php

include "DataBaze.php";

session_start();

header("Content-type: text/html; charset=utf-8");

$passed = false; //смотрит была ли установлена галочка "Я не робот!"

if (isset($_POST['reg'])) { //если была нажата кнопка, то выполнить

$url = 'https://www.google.com/recaptcha/api/siteverify'; //соединение с Google

$secret = 'вставить сюда секретный ключ';

$response = file_get_contents($url . "?secret=" . $secret . "&response=" . $_POST['g-recaptcha-response'] . "&remoteip=" . $_SERVER['REMOTE_ADDR']);// Получить содержимое файла в виде одной строки

$data = json_decode($response);//Получаем разрешение от Google на установку флажка "Я не робот!"

if (isset($_POST["g-recaptcha-response"]) && $_POST["g-recaptcha-response"]){ // если запрос выполнен строка декодирована json_decode, то исполняем код дальше

$passed=true;

Как говорилось раньше, переменной $passed мы присвоим значение false, что будет означать- флаг не установлен. В 12 строке мы присваиваем true, что означает- человек прошел проверку, Google дал добро, флаг "Я не робот!" успешно установлен и можно обрабатывать остальные поля, например узнаем от пользователя: имя, фамилию и т.д

III-й этап реализации

Теперь все будет проще; ранее говорилось, что надо узнать от пользователя его данные, но так же нужно вывести ошибку если он ничего не введет. Удобнее всего для этого использовать условие if, а в условии лучше всего прописать или...или. Добавляем несколько строчек кода. Допустим мы будем спрашивать у пользователя:

  • Имя
  • Фамилия
  • Логин
  • Номер телефона
  • E-mail пользователя
  • Пароль

Итак, допишем одну строку

<?php

include "DataBaze.php";

session_start();

header("Content-type: text/html; charset=utf-8");

$passed = false; //смотрит была ли установлена галочка "Я не робот!"

if (isset($_POST['reg'])) { //если была нажата кнопка, то выполнить

$url = 'https://www.google.com/recaptcha/api/siteverify'; //соединение с Google

$secret = 'вставить сюда секретный ключ';

$response = file_get_contents($url . "?secret=" . $secret . "&response=" . $_POST['g-recaptcha-response'] . "&remoteip=" . $_SERVER['REMOTE_ADDR']);// Получить содержимое файла в виде одной строки

$data = json_decode($response);//Получаем разрешение от Google на установку флажка "Я не робот!"

if (isset($_POST["g-recaptcha-response"]) && $_POST["g-recaptcha-response"]){ // если запрос выполнен строка декодирована json_decode, то исполняем код дальше

$passed=true;

if ($_POST['name'] == ' ' | | $_POST['familiya'] == ' ' | | $_POST['login'] == ' ' | | $_POST['telephonenumber'] == ' ' | | $_POST['email'] == ' ' | | $_POST['password'] == ' '){

echo '<script type="text/javascript">alert("Поля обязательны для заполнения"); document.location.href ="/reg/";</script>';}

Вот так должен выглядеть Ваш код на данном этапе:

                                                      Регистрация III-й этап программирования
Регистрация III-й этап программирования

Разумеется, как только данные получены, то их нужно обработать и сохранить, а пароль следует тщательно зашифровать. Однако, перед сохранением и шифрованием данных следует очистить их от мусора, но не просто от мусора, а мусора:

  • html
  • xhtml
  • css
  • php

С этого момента начинается этап №4 под названием "Фильтрация данных".

IV-й этап реализации

Пожалуй самый короткий, но самый важный этап это- "Фильтрация данных". Для начала немного теории... Пользователи бывают и хорошими, и плохими; если с первыми более менее понятно, то не понятно, что делать с плохими, ведь они могут злонамеренно написать html-код, а это может привести к нежелательным результатам, а о php я даже не говорю. Однако, существует выход. Например, можно использовать FILTER_SANITIZE_STRING, однако эта опция поддерживается только с версии PHP5.2 и выше, включая версию PHP7.1.

Фильтрация данных-отсеивание данных, в которых нет необходимости для принятия решений, снижающее уровень шума и повышающее достоверность и адекватность данных.

В нашем случае необходимо превратить html-сущности, то есть:

Допустим, что в поле логин вводят : <html><body>Испорчу Ваш сайт</body></html>. Однако, мы предусматриваем это и используем Фильтрацию данных:

  • foreach($_POST as $k => $v) $_POST[$k] = htmlspecialchars($v);
  • extract($_POST);

Так что же делают эти две строки? Давайте посмотрим внимательней:

-7

так, в нашем случае мы получим что вроде, того, что на картинке:

-8

Однако, стоит отметить, что начиная с PHP7.0 использовать эту функцию запрещено, а если быть точным, попросту- невозможно. Даже, если Вы будете использовать её, то ничего не произойдет, а в нашем скрипте вызовет, как минимум, 20 ошибок. К счастью, существует более универсальная опция, она упоминалась ранее, но повторю- FILTER_SANITIZE_STRING. О ней мы поговорим в отдельной статье, которая будет называться: «Фильтрация данных». Однако, стоит добавить, что бывают псевдо-хорошие пользователи, они, как правило, не атакуют методом приведенным Выше, а просто регистрируются на сайте много раз под одними данными. Предотвратить это можно, следующим методом:

$sql = mysql_query("SELECT * FROM users WHERE login='$login' OR email='$email' OR telephonenumber='$telephonenumber'") or die(mysql_error());

if (mysql_num_rows($sql) > 0){

echo '<script type="text/javascript">alert("Пользователь с такими данными уже числится. Проверку прошли ЛОГИН EMAIL НОМЕР ТЕЛЕФОНА");document.location.href = "/reg/";</script>';}

Конечно, все эти методы устарели, более того, если на Ваш сайт пойдет хакер «со знанием своего дела», то данные Ваших пользователей могут быть в опасности, так как сможет перехватить переменные, в которых так и хранятся данные. Есть ли защита? Ответ: да, но стоит учесть, что абсолютной защиты нет (рано или позно придумаю, как взломать php-скрипт). Стоит использовать драйвера PDO, подготовленные запросы.

ВНИМАНИЕ! Используя PDO и подготовленные запросы, стоит учесть, что в быстродействии Вы проиграете, зато у Вас будет комплексная защита от SQL-атак.

Думаю, время переходить к этапу №5, но давайте посмотрим на код в настоящий момент.

<?php

include "DataBaze.php";

session_start();

header("Content-type: text/html; charset=utf-8");

$passed = false; //смотрит была ли установлена галочка "Я не робот!"

if (isset($_POST['reg'])) { //если была нажата кнопка, то выполнить

$url = 'https://www.google.com/recaptcha/api/siteverify'; //соединение с Google

$secret = 'вставить сюда секретный ключ';

$response = file_get_contents($url . "?secret=" . $secret . "&response=" . $_POST['g-recaptcha-response'] . "&remoteip=" . $_SERVER['REMOTE_ADDR']);// Получить содержимое файла в виде одной строки

$data = json_decode($response);//Получаем разрешение от Google на установку флажка "Я не робот!"

if (isset($_POST["g-recaptcha-response"]) && $_POST["g-recaptcha-response"]){ // если запрос выполнен строка декодирована json_decode, то исполняем код дальше

$passed=true;

if ($_POST['name'] == ' ' | | $_POST['familiya'] == ' ' | | $_POST['login'] == ' ' | | $_POST['telephonenumber'] == ' ' | | $_POST['email'] == ' ' | | $_POST['password'] == ' '){

echo '<script type="text/javascript">alert("Поля обязательны для заполнения"); document.location.href ="/reg/";</script>';}

else{

foreach($_POST as $k => $v) $_POST[$k] = htmlspecialchars($v);

extract($_POST);

$sql = mysql_query("SELECT * FROM users WHERE login='$login' OR email='$email' OR telephonenumber='$telephonenumber'") or die(mysql_error());

if (mysql_num_rows($sql) > 0){

echo '<script type="text/javascript">alert("Пользователь с такими данными уже числится. Проверку прошли ЛОГИН EMAIL НОМЕР ТЕЛЕФОНА");document.location.href = "/reg/";</script>';}

V-й этап реализации

Данный этап является финальным, в нем мы сделаем оставшиеся настройки, а именно:

  • занесем полученные данные в базу данных
  • сделаем ответ в случае, если флажок «Я не робот!» не установлен.

Итак, необходимо сохранить полученную от пользователя информацию. На хостинге можно встретить программу для работы с Базой Данных- phpMyAdmin.

Уважаемые читатели этой статьи!
В данной статье приводится php код, а как создать таблицу в Базе Данных, мы рассмотрим на живом примере в статье "Работа с Базой Данных (SQL)".
Если возникли трудности (к текущему этапу), то после чтения отправьте Ваш вопрос на e-mail: programm.robots@ukr.net . Так же вопрос можно оставить в комментариях или задать в Личные сообщения сообщества

Что бы сохранить полученные данные понадобится:

  • подключиться к Базе Данных (mysql_query)
  • выполнить приказ (SQL- запрос)
  • вывести сообщение об успешной регистрации (для удобства пользователя)

Итак, начнем прописывать программный код:

mysql_query("INSERT INTO users SET name='$name',familiya='$familiya',login='$login',telephonenumber='$telephonenumber',email='$email',password='$password',ip='$ip'");

echo '<script type="text/javascript">alert("Регистрация завершена успешно!");document.location.href = "/reg/";</script>';

Вот собственного говоря и все, подходит к концу эта длинная статья, но все же объясню SQL-запрос.

  • INSERT - с английского - вставить
  • INTO - с английского - в
  • SET -c английского- набор

Получается, что мы говорим компьютеру:

Вставь в таблицу users следующий набор данных: имя, фамилия и т.д

Однако все это условная человеческая болтовня, компьютер исполняет команды и все.

Последняя часть это ответ, в случае, если пользователь не ввел капчу. вот как он выглядит, а текст Вы можете менять:

else echo '<script type="text/javascript">alert("Ошибка! Google сообщил нам, что Вы не индефицировались в ReCAPCHA. Мы настоятельно рекомендуем поставить флажок "Я не робот!". Сейчас введенная Вами информация сброшена и Вам придется ввести форму и флажок заново. "); </script>';

Вот и все, предлагаю посмотреть все php-code:

<?php

include "DataBaze.php";

session_start();

header("Content-type: text/html; charset=utf-8");

$passed = false; //смотрит была ли установлена галочка "Я не робот!"

if (isset($_POST['reg'])) { //если была нажата кнопка, то выполнить

$url = 'https://www.google.com/recaptcha/api/siteverify'; //соединение с Google

$secret = 'вставить сюда секретный ключ';

$response = file_get_contents($url . "?secret=" . $secret . "&response=" . $_POST['g-recaptcha-response'] . "&remoteip=" . $_SERVER['REMOTE_ADDR']);// Получить содержимое файла в виде одной строки

$data = json_decode($response);//Получаем разрешение от Google на установку флажка "Я не робот!"

if (isset($_POST["g-recaptcha-response"]) && $_POST["g-recaptcha-response"]){ // если запрос выполнен строка декодирована json_decode, то исполняем код дальше

$passed=true;

if ($_POST['name'] == ' ' | | $_POST['familiya'] == ' ' | | $_POST['login'] == ' ' | | $_POST['telephonenumber'] == ' ' | | $_POST['email'] == ' ' | | $_POST['password'] == ' '){

echo '<script type="text/javascript">alert("Поля обязательны для заполнения"); document.location.href ="/reg/";</script>';}

else{

foreach($_POST as $k => $v) $_POST[$k] = htmlspecialchars($v);

extract($_POST);

$sql = mysql_query("SELECT * FROM users WHERE login='$login' OR email='$email' OR telephonenumber='$telephonenumber'") or die(mysql_error());

if (mysql_num_rows($sql) > 0){

echo '<script type="text/javascript">alert("Пользователь с такими данными уже числится. Проверку прошли ЛОГИН EMAIL НОМЕР ТЕЛЕФОНА");document.location.href = "/reg/";</script>';}

else { $ip = $_SERVER['REMOTE_ADDR']; mysql_query("INSERT INTO users SET name='$name',familiya='$familiya',login='$login',telephonenumber='$telephonenumber',email='$email',password='$password',ip='$ip'");

echo '<script type="text/javascript">alert("Регистрация завершена успешно!");document.location.href = "/reg/";</script>';

header("Location: index.php");

exit; }

}

}

else echo '<script type="text/javascript">alert("Ошибка! Google сообщил нам, что Вы не индефицировались в ReCAPCHA. Мы настоятельно рекомендуем поставить флажок "Я не робот!". Сейчас введенная Вами информация сброшена и Вам придется ввести форму и флажок заново. "); </script>'; }

?>

На этом все, встретимся в следующей статье!