Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
  • Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Веб Продвинутая регистрация с подтверждением почты

ranek

Старожил
Пользователь
Баллы
123
Алгоритм действий:
1)
Игрок создает аккаунт.
2) Ему на почту приходит ссылка для подтверждения.
3) Он ее нажимает, и тогда скрипт check_reg проверяет правильность ссылки, если всё хорошо - меняет значение на 1(validate). Если же не подтвердил, то вместо 1 будет строка размером в 32 символа.
4) В нужных Вам скриптах Вы вставляете код проверки, ниже я напишу пример, который будет впускать на сервер только тех игроков, которые подтвердили почту.
----------
Создаем таблицу users в вашей базе данных.
PHP:
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` text NOT NULL,
  `email` text NOT NULL,
  `password` varchar(32) NOT NULL,
  `validate` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
----------
Скачиваем архив. Видим два файла:
* index.php - регистрирует аккаунт.
* check_reg.php - "проверяет регистрацию".
----------
Открываем index.php:
* На 11 строке пишем свой хост.
* На 12 строке пишем свой логин от базы данных.
* На 13 строке пароль от базы данных.
* На 14 строке имя базы данных.
* На 15 строке имя таблицы.
* На 16 строке имя колонки с логинами.
* На 17 строке имя колонки с паролями.
* На 18 строке имя колонки с email'ами.
* На 19 строке имя временных паролей подтверждения. Если там в значении стоит 1, значит аккаунт подтвержден.
* На 20 строке пишем ПОЛНЫЙ ПУТЬ к второму скрипту(check_reg.php).
* На 21 строке пишем свою "соль", это служит для "защиты" подтверждения аккаунта.
Теперь открываем check_reg.php и проделываем те же операции, что проделали с index.php.
Готово! :)
 

Вложения:

  • REG.zip
    REG.zip
    Размер файла
    1,8 КБ
    Просмотров
    100
Последнее редактирование:
Так выглядит checkserver.php с проверкой почты. Как мы знаем, если validate=1 - тогда пустит, если что-то другое - то не пустит.
PHP:
<?php
define('INCLUDE_CHECK',true);
include ("connect.php");

$user = mysql_real_escape_string($_GET['user']);
$serverid = mysql_real_escape_string($_GET['serverId']);

$result = mysql_query("Select $db_columnUser From $db_table Where $db_columnUser='$user' And $db_columnServer='$serverid' And validate=1") or die ("Запрос к базе завершился ошибкой.");

if(mysql_num_rows($result) == 1){
    echo "YES";
} else{
    echo "NO";
}

?>
 
Последнее редактирование:
Алгоритм действий:
1)
Игрок создает аккаунт.
2) Ему на почту приходит ссылка для подтверждения.
3) Он ее нажимает, и тогда скрипт check_reg проверяет правильность ссылки, если всё хорошо - меняет значение на 1(validate). Если же не подтвердил, то вместо 1 будет строка размером в 40 символом.
4) В нужных Вам скриптах Вы вставляете код проверки, ниже я напишу пример, который будет впускать на сервер только тех игроков, которые подтвердили почту.
----------
Создаем таблицу users в вашей базе данных.
PHP:
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` text NOT NULL,
  `email` text NOT NULL,
  `password` varchar(40) NOT NULL,
  `validate` varchar(40) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
----------
Скачиваем архив. Видим два файла:
* index.php - регистрирует аккаунт.
* check_reg.php - "проверяет регистрацию".
----------
Открываем index.php:
1) Меняем на 6 строке надпись 228jaguar228. Это наша "соль", она служит для того, чтобы невозможно было угадать код подтверждения, который будет отправляться по почте.
2) Ищем конструкции типа
PHP:
echo "бла-бла";
, меняем сообщения на свой вкус. Думаю, тут комментарии излишни.
3) Ищем на 19 строке такую конструкцию
PHP:
mysql_connect("localhost","root","password")
.
Тут мы localhost меняем на свой хост, root - на имя пользователя, password - пароль. Это подключение к базе данных.
4) На 20 строке ищем
PHP:
mysql_select_db("test")
. test меняем на свою базу данных.
Всё, с этим файлом мы разобрались.
----------
1)
Ищем конструкции типа
PHP:
echo "бла-бла";
, меняем сообщения на свой вкус.
2) Ищем на 3 строке такую конструкцию
PHP:
mysql_connect("localhost","root","password")
.
Тут мы localhost меняем на свой хост, root - на имя пользователя, password - пароль.
3) На 4 строке ищем
PHP:
mysql_select_db("test")
. test меняем на свою базу данных.
----------
Итак, мы вроде разобрались с этими скриптами, в резервном слоте я напишу пример, про который я говорил еще в начале этого поста.
Что это? Почему mysql? Зачем это на форуме, этого завались в гугле!
 
ranek, Во 1ых говнокод во 2ых зачем - GenerateHash, если уже есть password_hash ();
 
ranek, Во 1ых говнокод во 2ых зачем - GenerateHash, если уже есть password_hash ();
Не знал об такой функции. По поводу говнокода - я согласен. Можете сказать, говнокод потому что не красиво оформил скрипт? Или много лишней "дряни"? Скорее всего то, и то(мое мнение)
 
Можете сказать, говнокод потому что не красиво оформил скрипт? Или много лишней "дряни"? Скорее всего то, и то(мое мнение)
1. Вырвиглазное форматирование кода.
2. Комментарии должны быть на отдельных строчках, иначе сливаются с кодом. Учитывая первый пункт - всё превращается в жуткую кашу. К тому же, не стоит комментировать каждую строчку - это захламляет код, который должен быть самодокументированным. Комментарии стоит писать только в сложных \ спорных моментах - там, где они действительно необходимы.
3. Бесполезные серверные проверки - проверка на совпадение паролей должна быть на стороне клиента, совать её в скрипты нет никакого смысла.
4. Не понимание своего же кода, empty($pass) никогда не выдаст true - там будет md5 в любом случае.
5. Запредельная вложенность if'ов там, где можно просто прервать выполнение скрипта или выкинуть исключение.
6. Отсутствие проверки на минимальную длину пароля.
7. Отсутствие хоть какой-то конфигурации, параметры разбросаны по коду.
8. Отсутствие фильтрации переменных - mysql-инъекции везде.
9. Использование устаревшего расширения mysql, очень плохо. MySQLi, либо PDO.
10. Вывод mysql ошибок - ужасно. Такие вещи в некоторых случаях позволяют раскрутить те инъекции, которые без этого вывода были бы недоступны, либо (blind) трудно раскручиваемы. Да и в целом такую информацию юзерам показывать не стоит.
11. Двойные \ одинарные кавычки в строках не на своих местах - двойные там, где нет переменных, одинарные там, где должны быть двойные.. 'username="'.$login.'"'; vs "username = '{$login}'";
12. Излишние запросы в БД - проверку логина и е-мейла можно было бы объединить в один запрос.
 
ranek, 1. Хорошо отредактируй код, 2. Забудь про Mysql 3. Мне лень ковырять его, потому что не красивый.
 
Тут уже всё до меня сказали. Остаётся сказать - "Тема жутко коррелирует с моей подписью."
А лучше сначала научиться писать и потом не выкладывать настолько дырявые скрипты в паблик. К тому же инструкция слишком сложна для установки "местной" аудиторией
 
3. Бесполезные серверные проверки - проверка на совпадение паролей должна быть на стороне клиента, совать её в скрипты нет никакого смысла.
5. Запредельная вложенность if'ов там, где можно просто прервать выполнение скрипта или выкинуть исключение.
8. Отсутствие фильтрации переменных - mysql-инъекции везде.
10. Вывод mysql ошибок - ужасно. Такие вещи в некоторых случаях позволяют раскрутить те инъекции, которые без этого вывода были бы недоступны, либо (blind) трудно раскручиваемы. Да и в целом такую информацию юзерам показывать не стоит.
12. Излишние запросы в БД - проверку логина и е-мейла можно было бы объединить в один запрос.
3) Как это можно осуществить?
5) exit();?
8) Это я вообще не понял. Можете объяснить?
10) Вы про mysql_error();? Можете объяснить?
12) Попробую сделать.
К тому же инструкция слишком сложна для установки "местной" аудиторией
Тонко.
 
3) Как это можно осуществить?
5) exit();?
8) Это я вообще не понял. Можете объяснить?
10) Вы про mysql_error();? Можете объяснить?
12) Попробую сделать.

Тонко.
3 - Javascript.
5 - exit, die, return (если в функции).. исключения (exceptions) с последующей обработкой.
8 - http://ru.wikipedia.org/wiki/Внедрение_SQL-кода
Никогда не стоит доверять данным, полученным от "3х источников", на сайте могут лазить не только простые юзера..
10 - mysql_error выводит отнюдь не то, что ожидает увидеть пользователь. Эта функция предназначена для разработчиков. Для простых юзеров получить вывод этой функции равноценно чтению китайских иероглифов. Во вторых, это не безопасно, в выводе функции можно получить не только имена таблиц, колонок и прочую "полезную" информацию, но и произвольные данные из этих таблиц, при правильно сформированном запросе (Error-Based Blind SQL Injection).
 
BlackSun, Зря так тыкать в каждую ошибку... Человек должен понять и научится сам.
 
3 варианта:

Проверить наличие логина и емейла двумя подзапросами:
SELECT EXISTS(SELECT 1 FROM users WHERE username = '{$login}') AS login, EXISTS(SELECT 1 FROM users WHERE email = '{$mail}') AS email
На выходе два столбца булевого типа (1 \ 0)

Либо проверить наличие логина или емейла простым запросом:
SELECT COUNT(1) FROM users WHERE username = '{$login}' OR email = '{$mail}' LIMIT 1
На выходе булевое значение - 1 или 0

Вариация второго варианта - сделать username и email столбцы уникальными, выкинуть предварительные проверки, после инсерта добавить проверку на ошибку:
if (mysql_errno() == 1062) {
// логин или мыло уже имеются в базе
}
 
3 варианта:

Проверить наличие логина и емейла двумя подзапросами:
SELECT EXISTS(SELECT 1 FROM users WHERE username = '{$login}') AS login, EXISTS(SELECT 1 FROM users WHERE email = '{$mail}') AS email
На выходе два столбца булевого типа (1 \ 0)

Либо проверить наличие логина или емейла простым запросом:
SELECT COUNT(1) FROM users WHERE username = '{$login}' OR email = '{$mail}' LIMIT 1
На выходе булевое значение - 1 или 0

Вариация второго варианта - сделать username и email столбцы уникальными, выкинуть предварительные проверки, после инсерта добавить проверку на ошибку:
if (mysql_errno() == 1062) {
// логин или мыло уже имеются в базе
}
Второй по душе. Позже перепишу код, посмотрим что выйдет. Оставил свой выбор за mysqli. Более - менее "вдуплился" в защиту от sql инъекций.
 

Поделиться этой страницей

Назад
Верх