Вопросы

rediska
Освоившийся

Всем привет! Я пишу своё мод с нуля, и тут у меня возникла проблема с авторизацией. Я не могу сделать проверку на правильность введённого пароля.

        case DLG_LOG:
        {
            if(response)
            {
                //ВОТ ТУТ ДОЛЖНА БЫТЬ ПРОВЕРКА НА ПРАВИЛЬНОСТЬ ПАРОЛЯ
                {
                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+32)];
                    format(query, sizeof(query), fmt_query, player_info[playerid][PASSWORD]);
                    mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);
                    SCM(playerid, COLOR_GOLD, "Вы авторизовались!");
                }
                else
                {
                    new string[87];
                    SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")-1);
                    if(GetPVarInt(playerid, "WrongPassword") > 0)
                    {
                        format(string, sizeof(string), "[Ошибка] {FFFFFF}Вы ввели неверный пароль от аккаунта. У вас осталось %d попыток ввода.", GetPVarInt(playerid, "WrongPassword"));
                        SCM(playerid, COLOR_RED, string);
                    }
                    if(GetPVarInt(playerid, "WrongPassword") == 0)
                    {
                        SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF} Вы исчерпали лимит попыток ввода и были отключеный от сервера.");
                        SPD(playerid, -10" "" "" """);
                        return Kick(playerid);
                    }
                    ShowLogin(playerid);
                }
            }
            else
            {
                SCM(playerid, COLOR_RED, "Используйте \"/q(uit)\", для выхода из игры");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }
        }
    }
    return 1;

 

Поделиться сообщением


Ссылка на сообщение

27 ответов на этот вопрос

  • 0
_bogdan_
Завсегдатый

@rediska 

                if(GetPVarInt(playerid, "WrongPassword") == 2return SCM(playerid,COLOR_LIGHTRED," Неверный пароль. Используйте /q для выхода."), Kick(playerid);
                SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")+1);
                format(QUERY,256"Ваш текст.",3-GetPVarInt(playerid, "WrongPassword"));
                ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX, "Ошибка!",QUERY, "Повтор""Выйти");

 

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@_bogdan_ Это у меня есть. Мне нужна проверка на правильность введённого пароля, вот она:

if(inputtext, player_info[playerid][PASSWORD])

И она не работает, она пропускает любой введёный пароль

 

Код самой авторизации

Спойлер

case DLG_LOG:
        {
            if(response)
            {
                if(inputtext, player_info[playerid][PASSWORD])
                {
                    new query[126];
                    format(query, sizeof query, "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'", player_info[playerid][NAME], player_info[playerid][PASSWORD]);
                    mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);
                }
                else
                {
                    new string[87];
                    SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")-1);
                    if(GetPVarInt(playerid, "WrongPassword") > 0)
                    {
                        format(string, sizeof(string), "[Îøèáêà] {FFFFFF}Âû ââåëè íåâåðíûé ïàðîëü îò àêêàóíòà. Ó âàñ îñòàëîñü %d ïîïûòîê ââîäà.", GetPVarInt(playerid, "WrongPassword"));
                        SCM(playerid, COLOR_RED, string);
                    }
                    if(GetPVarInt(playerid, "WrongPassword") == 0)
                    {
                        SCM(playerid, COLOR_RED, "[Îøèáêà] {FFFFFF} Âû èñ÷åðïàëè ëèìèò ïîïûòîê ââîäà è áûëè îòêëþ÷åíûé îò ñåðâåðà.");
                        SPD(playerid, -10" "" "" """);
                        return Kick(playerid);
                    }
                    ShowLogin(playerid);
                }
            }
            else
            {
                SCM(playerid, COLOR_RED, "Èñïîëüçóéòå \"/q(uit)\", äëÿ âûõîäà èç èãðû");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }
        }
    }
    return 1;
}

 

 

Отредактировано пользователем rediska

Поделиться сообщением


Ссылка на сообщение
  • 0
15 часов назад, rediska сказал:

                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";

этот запрос по сути и проверяет правильность пароля. 

Вы достаете всю информацию по пользователю, у которого такой ник и пароль. 

15 часов назад, rediska сказал:

                    mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);

вот эта строка отправляет SQL запрос, его результат придет в public PlayerLogin. 

Там необходимо проверить количество строк, если их ноль => пользователя с таким логином и паролем нет, в противном случае там будет вся информация по этому пользователю из базы данных. 

Поделиться сообщением


Ссылка на сообщение
  • 0

@rediska а что значит теперь? Я же не вносил никаких правок, я просто рассказал что и за что отвечает. 

В коде этого диалога (как я понимаю это диалог ввода пароля) должно остаться только формирование запроса и его отправка с помощью mysql_tquery. Вся остальная логика должна быть вынесена в PlayerLogin, туда придет ответ от плагина mysql

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@DEST не подскажешь как исправить? warning 219: local variable "query" shadows a variable at a preceding level

строчка на которую жалуется:

new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+32)];

 

Поделиться сообщением


Ссылка на сообщение
  • 0
_bogdan_
Завсегдатый

@rediska 

warning 219: local variable "%s" shadows a variable at a preceding level - переменная дважды объявлена;

@rediska У вас дважды обьявлена одна и та же переменная. Из-за чего появилась ошибка.

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@_bogdan_ так её тут не убрать, вот код:

if(response)
            {
                new checkpass[32];
                new query[126];
                static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);
                if(strcmp(player_info[playerid][PASSWORD], checkpassfalse))
                {
                    static const fmt_query2[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+32)];//ОШИБКА ТУТ - warning 219: local variable "query" shadows a variable at a preceding level
                    format(query, sizeof(query), fmt_query, player_info[playerid][PASSWORD]);
                    mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);
                }

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@rediska тут нужно остановиться, дать отдохнуть рукам и перестать просто копировать код. Нужно подумать. 

Зачем нужно условие 

2 часа назад, rediska сказал:

                if(strcmp(player_info[playerid][PASSWORD], checkpassfalse))

если я раннее писал, что в этом диалоге не получится проверить правильность пароля. 

У нас есть то, что нам ввел пользователь, но нет правильного пароля. Поэтому в strcmp не получится ничего сравнить. 

Давайте мелкими шагами, задача: оставить в диалоге только формирование и отправку SQL запроса. Как сделаете, скидывайте сюда что получилось. 

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@DEST 

new checkpass[32];
mysql_tquery(inputtext, player_info[playerid][PASSWORD], checkpass, 32);
if(strcmp(player_info[playerid][PASSWORD], checkpassfalse32) == 0 && isnull(checkpass))

и она жалуется сейчас на строчку:

mysql_tquery(inputtext, player_info[playerid][PASSWORD], checkpass, 32);

Ошибка:error 035: argument type mismatch (argument 1)

error 035: argument type mismatch (argument 1)

 

Отредактировано пользователем rediska

Поделиться сообщением


Ссылка на сообщение
  • 0

@rediska создали переменную checkpass, затем вызвали mysql_tquery, проверили на совпадение строку player_info[playerid][PASSWORD] и то, что хранится в новой переменной checkpass. 

Что этот набор действий должен был сделать? 

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@DEST Я просто только начал заниматься этим делом. И мод пишу по урокам. Ещё пока что не совсем понимаю что и как делать. Можете подсказать?

Поделиться сообщением


Ссылка на сообщение
  • 0

@rediska Вот хорошая точка старта => https://pro-pawn.ru/showthread.php?4082-Учебник-Pro-Pawn-ru

Посмотрите, почитайте уроки что там есть (их там немного, всего 15). Это даст больше понимания того, что происходит в коде и как он вообще выполняется. 

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@DEST Хорошо прочту я как раз ищу такие уроки. Ну я так понимаю мне с моей проблемой не помогут?

 

 

Поделиться сообщением


Ссылка на сообщение
  • 0

@rediska конечно помогут, но чтобы понять то,  что вам пытаются подсказать, нужно основы узнать. Иначе так и останетесь на уровне скопировать -вставить. 

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@DEST не рабочая ссылка на скачку

 

Отредактировано пользователем rediska

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@SCRIPTMAN не подскажешь как сделать запрос в бд проверку на правильность пароля. А то у меня мод уже 4 день стоит

Поделиться сообщением


Ссылка на сообщение
  • 0
_bogdan_
Завсегдатый

@rediska Могу посоветовать один хороший канал на YouTube(не реклама), человек писал мод с нуля. Можете посмотреть видео-уроки, так же там есть видео-уроки по написанию системы авторизации/регистрации. Тык

Поделиться сообщением


Ссылка на сообщение
  • 0
rediska
Освоившийся

@_bogdan_ По его видео и делаю мод.У меня проблема в том что он подключал соль(шифровку) и через неё делает проверку пароля, а я не стал этого делать и теперь не знаю как сделать проверку.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • divinez
      От divinez
          else if (ReconPlayer[playerid][32] == playertextid)
              {
                  SubTextDelete(playerid);
                  if (pInfo[playerid][pAdmin] < 4 || !pTemp[playerid][PlayerADostup]) return 1;
                  if (!IsPlayerConnected(SpecAd[playerid])) return 1;
                  new ip[15];
                  GetPlayerIp(SpecAd[playerid],ip, sizeof ip);
                  SendMes(playerid, 0x6BB3FFAA,  "Nik [%s]   R-IP [%s]   L-IP [%s]   IP [%s]",pInfo[SpecAd[playerid]][pName], pInfo[SpecAd[playerid]][RegIP], pInfo[SpecAd[playerid]][LastIP], ip);
                  return 1;
              }
              else if (ReconPlayer[playerid][33] == playertextid)
              {
                  SubTextDelete(playerid);
                  SendClientMessage(playerid, COLOR_GREY, !"PUSTO 33");
                  return 1;
              } 
          }
          return 1;
      }
      public OnPlayerClickTextDraw(playerid, Text:clickedid)

          
          #if defined _items_inc
              if (items_OnPlayerClickTextDraw(playerid, clickedid)) return true;
          #endif
          #if defined _voting_inc
              if (voting_OnPlayerClickTextDraw(playerid, clickedid)) return true;
          #endif
          #if defined _poker_included
              if (poker_OnPlayerClickTextDraw(playerid, clickedid)) return true;
          #endif
          #if defined _blackjack_included
              if (blackjack_OnPlayerClickTextDraw(playerid, clickedid)) return true;
          #endif
          #if defined _inventory_inc
          if (!InvOpened[playerid]) {
              for(new i; i < sizeof TDEditor_TD; i++) {
                  if (clickedid == TDEditor_TD) {
                      SendMes(playerid, COLOR_GREY, "%d", i);
                  }
              }
          }
          #endif
          #if defined _businesses_inc
          
          if (pTemp[playerid][tGasMenuShowed]) {
          
              if (clickedid == Text:INVALID_TEXT_DRAW) {
                  HideMenuGas(playerid);
                  return true;
              }
              if (clickedid == BusinessGAS_TD[6]) { // -
                  pTemp[playerid][tGasMenuProgress] -= 10.0;
                  if (pTemp[playerid][tGasMenuProgress] < 1.0) pTemp[playerid][tGasMenuProgress] = 1.0; 
                  SetGasMenuProgressBar(playerid, pTemp[playerid][tGasMenuProgress]);
                  return true;
              }
              else if (clickedid == BusinessGAS_TD[7]) { // +
                  pTemp[playerid][tGasMenuProgress] += 10.0;
                  if (pTemp[playerid][tGasMenuProgress] > 200.0) pTemp[playerid][tGasMenuProgress] = 200.0;
                  SetGasMenuProgressBar(playerid, pTemp[playerid][tGasMenuProgress]);
                  return true;
              }
              else if (clickedid == BusinessGAS_TD[10]) { // /fill buy
                  new vehicleid = GetPlayerVehicleID(playerid);
                  new amount = floatround(pTemp[playerid][tGasMenuProgress] - VehicleInfo[vehicleid - 1][vFuel]);
                  BuyBusinessItem(playerid, 0, amount);
                  HideMenuGas(playerid);
                  return true;
              }
          }
          #endif
          #if defined _dice_game_inc
              if (bone_OnPlayerClickTextDraw(playerid, clickedid)) return true;
          #endif
          if (clickedid == Text:INVALID_TEXT_DRAW)
          {
              if (pTemp[playerid][tPlayerReg]) return SelectTextDraw(playerid, 0xFF4040AA);
              if (GetPVarInt(playerid, "tuning_opened")) return SelectTextDraw(playerid, 0xFF4040AA);
              //if (GetPVarInt(playerid, "BoneStol")) return SelectTextDraw(playerid, 0x33AAFFFF);