Вопросы

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

        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

@rediska 

if(!strcmp(inputtext, player_Info[playerid][pPassword], false))

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


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

@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

@_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

@DEST @DESTТеперь жалуется на это:

error 017: undefined symbol "query"
warning 203: symbol is never used: "fmt_query"

 

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


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

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

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

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


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

@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

@rediska 

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

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

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


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

@_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

@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

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

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


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

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

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

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


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

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

 

 

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


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

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

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


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

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

 

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

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


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

@rediska рабочая. Какие проблемы? 

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


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

@SCRIPTMAN @SCRIPTMAN@SCRIPTMAN У м@DESTу меня не работает

 

 

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


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

@rediska Вот, держи

ProPawnManualsSetup.zip

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


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

@SCRIPTMAN спасибо

 

 

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


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

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

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


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

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

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


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

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

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


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

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

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

    • Talex
      От Talex
      Всем привет, сливаю первый мод!
      Информация о моде:

      — Основа Gamenix.
      — Мод переведен на Mysql R39, теперь ни каких слётов нет, мод работает стабильно с онлайном 160+.
      — Новый автосалон на TextDraw.
      — Система 3-х автомобилей (1 можно купить по дефолту, 2 и 3 за донат).
      — Автомобили у игроков теперь не пропадают (Id'ы авто сбивались, с номерами теперь тоже всё в порядке).
      — Оформление сервера полностью переработано, теперь оно более красивое.
      — Защита от копирования карты.
      — в меню сервера добавлен пункт визуальных настроек.
      — Номера на транспорт теперь можно приобрести в /donate.
      — Сделан новый красивый спидометр.
      — При получении номера, добавлен выбор региона.
      — Сделана система радаров и промокодов, создание прямо из игры.
      — Новый интерьер казино.
      — Магазин скинов теперь на TextDraw.
      — Автошкола полностью функционирует.
      — Добавлена информация после коннекта о последнем входе в собственный аккаунт.
      — Приватная защита от всех видов DDoS атак и DoS атак.                                                                                                                                    
      — пароль от АП (/alog) теперь у каждого администратора индивидуальный.
      — Изменено оформление самого мода
      Это не все изменения мода, их ещё очень много. все не упомнишь. 
      Автор мода: Неизвестен
      CUNBERS RP 8.4.3.rar