На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Предназначение данного раздела
Данный раздел предназначен для публикации уроков и примеров по разработке компьютерных игр любого сорта, в том числе авторских проектов участников нашего форума. Главное условие публикации: необходимо не только выложить свое творение, но и подробно описать процесс его создания, подводные камни и прочие, интересные для собрата-разработчика, вкусности.

Если вы желаете выложить свой проект - пишите в Общеорганизационную тему. Есть какие-то другие вопросы по делу - туда же.

Модераторы: Da$aD
  
> [MMORPG своими руками] 3 Техническая демоверсия, пункты: 3.7
    3.7 Регистрация

    Регистрация пользователя происходит в три этапа.
    1. Клиент запрашивает каптчу. Каптча необходима нам для борьбы с ботами.
    Сервер генерует код каптчи и записывает его в сессию
    ExpandedWrap disabled
      $_SESSION["captcha_code"] = substr(md5(uniqid("")),0,4);
      $writer = startAnswer('Register');
      sendAnswer($writer);

    После этого клиент запрашивает каптчу у генерирующего скрипта, который по ID сессии
    определяет код каптчи. Клинт отрисовывает каптчу
    ExpandedWrap disabled
      @Override
          public void showModule(Node data){
              try{
                  mCaptha = ImageIO.read(ClientCore.downloadFile("scripts/captcha.php"));
              }catch (IOException ex){
                  // ....
              }
              super.showModule(data);
          }
          @Override
          protected void paintComponent(Graphics g){
              super.paintComponent(g);
              g.drawImage(mCaptha, 120 ,100 , null);
          }

    2. Игрок отправляет регистрационные данные и код каптчи. Сначала сервер проверят код каптчи.
    Если код каптчи не верен, то код сбрасывается, чтобы небыло возможности подбора
    ExpandedWrap disabled
      $code_captcha = getString("code",4,4);
              if($_SESSION["captcha_code"] == ""){
                  // попытка взлома. каптчу еще никто не запрашивал
              }else if($code_captcha != $_SESSION["captcha_code"]){
                  // Неверно введенный код. Отправим сообщение клиенту об этом.
                  // А сами сотрем код из сессии
              }else{
                 // код правильный
              }

    После этого мы отправляем на указанную пользователем почту (если такая почта еще не зарегистрирована )код активации, который мы предварительно сгенерировали. Подтверждение по почте необходимо, чтобы проверить ее существование, т.к. почта будет нужна в некоторых ситуациях.
    ExpandedWrap disabled
              $_SESSION["mail_code"] = substr(md5(uniqid("")),0,5);
                  $result = mysql_query("SELECT id FROM user_data WHERE email = '".$_SESSION["email"]."'");
                  if(mysql_num_rows($result) != 0){
                      // Такой почтовый адрес уже используется"
                  }else if(!mail($_SESSION["email"], "MMORPG Own Hands Registration",
                      "Вас привествует регистрационный робот проекта MMORPG Own Hands
                      Код активации: ".$_SESSION["mail_code"],
                      "From: robot@sources-game.org.ua"))
                  {
                      // не смогли отослать письмо
                  }else{
                      // отправляем ответ для перехода к окну активации
                  }

    3 этап. Проверяем код активации аналогично коду каптчи и создаем аккаунт с начальными параметрами.

    3.7.1 Применение каптчи
    Вопрос о том, как правильно генерировать каптчу, достаточно обширный и связан с различными способами ее возможного распознавания ботами. В нашем проекте мы будем пользоваться достаточно простым скриптом генерации, взятым из бездн гугла.

    ExpandedWrap disabled
      session_start();
      $im = @imagecreate (80, 20);
      if(!$im)abortExecution("Cannot initialize new GD image stream!");
      $bg = imagecolorallocate ($im, 232, 238, 247);
      $char = $_SESSION['captcha_code'];
      for ($i=0; $i<=128; $i++){
          $color = imagecolorallocate ($im, rand(0,255), rand(0,255), rand(0,255));
          imagesetpixel($im, rand(2,80), rand(2,20), $color);
      }
      for ($i = 0; $i < strlen($char); $i++){
          $color = imagecolorallocate ($im, rand(0,255), rand(0,128), rand(0,255));
          $x = 5 + $i * 20;
          $y = rand(1, 6);
          imagechar ($im, 5, $x, $y, $char[$i], $color);
      }
      if (function_exists("imagejpeg"))
         imagejpeg($im);
      else
         abortExecution("no jpeg support in this server");
       
      imagedestroy ($im);

    Клиент будет получат и отображает нашу каптчу следующим способом:
    ExpandedWrap disabled
      @Override
          public void showModule(Node data)
          {
              try{
                  mCaptha = ImageIO.read(ClientCore.downloadFile("scripts/captcha.php"));
              }catch (IOException ex){
                  // ...
              }
              super.showModule(data);
          }
       
          @Override
          protected void paintComponent(Graphics g)
          {
              super.paintComponent(g);
              g.drawImage(mCaptha, 120 ,150 , null);
          }
       
          private BufferedImage mCaptha = null;
      Имхо вместо сессий лучше использовать табличку в базе, там же хранить состояние отправленной почты (например пол часа таймаут, или сутки), возможно с привязанным ИП, т.к. человек может случайно не получить письмо, его можно будет выслать повторно. По крайней мере уведомить, что его заявка принята и ждет отправки. Совет не игровой, сайтостроительный :)

      Я не знаю каким образом ведется обмен данными в сети (вижу что не дельфи =) ), но сессии держатся за клиентом через куки или get/post. Первых может не быть, тогда нужно обговорить этот момент
      user posted image
        Цитата antonn @
        Я не знаю каким образом ведется обмен данными в сети (вижу что не дельфи =) ), но сессии держатся за клиентом через куки или get/post. Первых может не быть, тогда нужно обговорить этот момент

        куков не может не быть, т.к. клиент самописный - не браузер, и он всегда их поддерживает
        об этом здесь: [MMORPG своими руками] 3 Техническая демоверсия

        Цитата antonn @
        Имхо вместо сессий лучше использовать табличку в базе, там же хранить состояние отправленной почты (например пол часа таймаут, или сутки), возможно с привязанным ИП, т.к. человек может случайно не получить письмо, его можно будет выслать повторно. По крайней мере уведомить, что его заявка принята и ждет отправки. Совет не игровой, сайтостроительный

        Да, мне тут тоже сказали, что в сессии почту хранить плохо. :(
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,1046 ]   [ 20 queries used ]   [ Generated: 16.08.18, 00:15 GMT ]