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

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

Тема в разделе "Веб-обвязки и лаунчеры", создана пользователем ranek, 19 янв 2014.

  1. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    Алгоритм действий:
    1)
    Игрок создает аккаунт.
    2) Ему на почту приходит ссылка для подтверждения.
    3) Он ее нажимает, и тогда скрипт check_reg проверяет правильность ссылки, если всё хорошо - меняет значение на 1(validate). Если же не подтвердил, то вместо 1 будет строка размером в 32 символа.
    4) В нужных Вам скриптах Вы вставляете код проверки, ниже я напишу пример, который будет впускать на сервер только тех игроков, которые подтвердили почту.
    ----------
    Создаем таблицу users в вашей базе данных.
    PHP:
    CREATE TABLE IF NOT EXISTS `users` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    usernametext NOT NULL,
      `
    emailtext NOT NULL,
      `
    passwordvarchar(32NOT NULL,
      `
    validatevarchar(32NOT NULL,
      
    PRIMARY KEY (`id`)
    ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=;
    ----------
    Скачиваем архив. Видим два файла:
    * 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
      Размер файла:
      1,8 КБ
      Просмотров:
      90
    Последнее редактирование: 20 янв 2014
    DENZell, vedmakMineLife и ApaDoctor нравится это.
  2. Хостинг MineCraft
    <
  3. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    Так выглядит 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";
    }

    ?>
     
    Последнее редактирование: 19 янв 2014
  4. AlexMerser

    AlexMerser Старожил Пользователь

    Баллы:
    173
    Что это? Почему mysql? Зачем это на форуме, этого завались в гугле!
     
    Pyani нравится это.
  5. BlackSun

    BlackSun Активный участник Пользователь

    Баллы:
    78
    Дикий говнокод (
     
    Pyani и AlexMerser нравится это.
  6. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    Ну уж извините, только учусь. Первая попытка написать "что-то эдакое".
    P.S. Это моя ошибка, не надо было это выкладывать на форум. Тут я согласен
     
  7. AlexMerser

    AlexMerser Старожил Пользователь

    Баллы:
    173
    очередной велосипед.
     
  8. fles

    fles Старожил Пользователь

    Баллы:
    153
    Skype:
    VadimVgb
    Имя в Minecraft:
    fles
    ranek, Во 1ых говнокод во 2ых зачем - GenerateHash, если уже есть password_hash ();
     
  9. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    Не знал об такой функции. По поводу говнокода - я согласен. Можете сказать, говнокод потому что не красиво оформил скрипт? Или много лишней "дряни"? Скорее всего то, и то(мое мнение)
     
  10. BlackSun

    BlackSun Активный участник Пользователь

    Баллы:
    78
    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. Излишние запросы в БД - проверку логина и е-мейла можно было бы объединить в один запрос.
     
    AlexMerser, ranek и Pyani нравится это.
  11. fles

    fles Старожил Пользователь

    Баллы:
    153
    Skype:
    VadimVgb
    Имя в Minecraft:
    fles
    ranek, 1. Хорошо отредактируй код, 2. Забудь про Mysql 3. Мне лень ковырять его, потому что не красивый.
     
  12. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    Лучше использовать mysqli? Или что-то другое?
     
  13. Pyani

    Pyani Активный участник Пользователь

    Баллы:
    88
    Тут уже всё до меня сказали. Остаётся сказать - "Тема жутко коррелирует с моей подписью."
    А лучше сначала научиться писать и потом не выкладывать настолько дырявые скрипты в паблик. К тому же инструкция слишком сложна для установки "местной" аудиторией
     
    ranek нравится это.
  14. fles

    fles Старожил Пользователь

    Баллы:
    153
    Skype:
    VadimVgb
    Имя в Minecraft:
    fles
    ranek, PDO
     
  15. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    3) Как это можно осуществить?
    5) exit();?
    8) Это я вообще не понял. Можете объяснить?
    10) Вы про mysql_error();? Можете объяснить?
    12) Попробую сделать.[DOUBLEPOST=1390158630,1390158492][/DOUBLEPOST]
    Тонко.
     
  16. BlackSun

    BlackSun Активный участник Пользователь

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

    fles Старожил Пользователь

    Баллы:
    153
    Skype:
    VadimVgb
    Имя в Minecraft:
    fles
    BlackSun, Зря так тыкать в каждую ошибку... Человек должен понять и научится сам.
     
  18. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    12) Через union?
     
  19. BlackSun

    BlackSun Активный участник Пользователь

    Баллы:
    78
    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) {
    // логин или мыло уже имеются в базе
    }
     
  20. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    Второй по душе. Позже перепишу код, посмотрим что выйдет. Оставил свой выбор за mysqli. Более - менее "вдуплился" в защиту от sql инъекций.
     
    ПриветОтЛайки нравится это.
  21. Автор темы
    ranek

    ranek Старожил Пользователь

    Баллы:
    123
    Какое отношение имеет это сообщение к данной Теме? Пришел, "нагадил" в эту тему своей ссылкой, я тебе ответил. Теперь ты говоришь что я школьник.
    Л - логично
     
    alden нравится это.

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