Nazwa serwera IP serwera Sloty
•••PolskiPartyServer™[PPS]®24/7••• @LiveServer.pl graj.server-pps.com:7777 500 Wejdź
Mumble 1.2 server-pps.com 100 Więcej

Rejestracja i logowanie

Moderator: Mod-Team

Rejestracja i logowanie

Postprzez Chief Reinoldo » 22 sie 2016, o 14:53

http://pastebin.com/fZXyR8hb

czy jest ktoś na tyle pomocny że powie co tu pomieszałem? dzięki z góry.

Na górze jest oczywiście enum i wszystko w PlayerCache[playerid][p...] - w bazie danych wszystko potworzone.
Obrazek
Obrazek
Obrazek
Avatar użytkownika
Chief Reinoldo
Banned
 
Posty: 1137
Dołączył(a): 31 mar 2013, o 21:36
Lokalizacja: POD PARASOLEM
Polubionych : 261 razy
Otrzymał polubień: 208 razy

Re: Rejestracja i logowanie

Postprzez Tiromaniak » 22 sie 2016, o 17:48

A co konkretnie nie działa?
Obrazek
Avatar użytkownika
Tiromaniak
Weteran
 
Posty: 1002
Dołączył(a): 31 lip 2012, o 08:20
Polubionych : 10 razy
Otrzymał polubień: 569 razy

Re: Rejestracja i logowanie

Postprzez Chief Reinoldo » 22 sie 2016, o 19:33

Da się zalogować każdym innym hasłem niż tym które jest poprawne.
(Myślałem że były jeszcze jakieś inne błędy, ale rejestracja jednak działa poprawnie - wszystko zapisuje się do bazy)
Obrazek
Obrazek
Obrazek
Avatar użytkownika
Chief Reinoldo
Banned
 
Posty: 1137
Dołączył(a): 31 mar 2013, o 21:36
Lokalizacja: POD PARASOLEM
Polubionych : 261 razy
Otrzymał polubień: 208 razy

Re: Rejestracja i logowanie

Postprzez Tiromaniak » 23 sie 2016, o 11:09

Zaczniemy od paru rad, które Ci się na pewno przydadzą w dalszej zabawie.

1. Nie musisz za każdym razem pobierać nicku gracza, nie potrzebne deklarowanie zmiennych. Wystarczy, że pobierzesz nick gracza przy dołączeniu na serwer - OnPlayerConnect. Coś takiego:

Kod: Zaznacz cały
GetPlayerName(playerid, PlayerCache[playerid][pUsername], MAX_PLAYER_NAME);


Usuń wszędzie te pobieranie nicku gracza i zmienną name, bo już nie będzie potrzebna.

2. Nie deklaruj zmiennej query lokalnie tylko zrób to globalnie, a będzie o wiele lepiej. Tak samo w przypadku stringów. Daj gdzieś na górze kodu:

Kod: Zaznacz cały
new query[256];


Stosujesz tak samo jak teraz, tylko nie musisz za każdym razem jej deklarować, bo w przypadku większej ilości zapytań nie będzie to optymalne.

3. Nigdy nie rób zapisywania hasła w taki sposób. Nawet jeśli się uczysz to jest już to zła praktyka. Podstawą jest hashowanie hasła w bazie danych, np. metodą SHA256 + sól.
Kod: Zaznacz cały
https://wiki.sa-mp.com/wiki/SHA256_PassHash


Jeśli znajdziesz plugin md5 do hashowania hasła to go nie używaj, bo został już napisany program, który dekoduje tę metodę.
W przypadku włamu na bazę danych, bo takie rzeczy się zdarzają hasła graczy zostają wykradzione, a nie wiesz czy nie mają takiego samego hasła do skrzynki Email, fb itp.

4. Zawsze, ale to zawsze stosuj funkcję:

Kod: Zaznacz cały
http://wiki.sa-mp.com/wiki/MySQL#mysql_real_escape_string


Stosuję się ją zawsze, gdy chcesz np. zmienić hasło gracza lub tablicę rejestracyjną pojazdu. Sprawdza ona, czy w podanym tekście nie ma niedozwolonych znaków, które mogą uszkodzić Twoją bazę danych. Np. masz taki kod:

Kod: Zaznacz cały
            format(query, sizeof(query), "INSERT INTO users (pNick, pPassword, pHealth, pArmor, pCash, pRanga, pScore, pSkin) VALUES ('%s','%s','100.0','100.0','0','1','0','0')", name, inputtext);
            mysql_query(query);


Inputtext to jest tekst, który jest wprowadzany do bazy i jeśli w nim znajdą się znaki, które mogą uszkodzić bazę danych, zostaje ona uszkodzona. Zawsze przed wprowadzaniem tekstu przed zapytaniami do bazy stosuje się coś takiego:

Kod: Zaznacz cały
mysql_real_escape_string(inputtext, inputtext);


Wtedy wszystko jest bezpieczne. Wziąłem tę funkcję z dokumentacji pluginu od Strickenkida, nie wiem jakiej Ty używasz. Jeśli od BlueG to chyba tam jest inna, ale nie jestem pewny.

To teraz dam Ci przykład hashowania metodą SHA256 z solą i z użyciem mysql_real_escape_string.

Kod: Zaznacz cały
if(dialogid == DIALOG_REGISTER)
    {
        if(response)
        {
           mysql_real_escape_string(inputtext, inputtext); // sprawdzanie, czy nie ma niedozwolonego znaku w haśle
                mysql_real_escape_string(PlayerCache[playerid][pUsername], PlayerCache[playerid][pUsername]); sprawdzanie, czy nie ma niedozwolonego znaku w nicku
       SHA256_PassHash(inputtext, "hSFaL3443", PlayerCache[playerid][pPassword], 64 + 1); // hashowanie wpisanego i sprawdzonego hasła

            format(query, 512, "INSERT INTO `players` (`login`, `pass`) VALUES ('%s', '%s');", PlayerCache[playerid][pName], PlayerCache[playerid][pPassword]);
            mysql_query(query); // wywoływanie zapytania do bazy

            new UID = mysql_insert_id(); // funkcja, która pobiera unikalne id konta, podstawa w rozbudowanych skryptach

            PlayerInfo[playerid][pUID]          = UID; // przypisywanie do zmiennej gracza
            print("zalogowany...");
            mysql_free_result(); // czyszczenie pamięci, zawsze na końcu przy insertach
       }

    if(dialogid == DIALOG_LOGIN)
    {
       if(response)
       {
          new password[ 64 + 1]; // zmienna, która przechowuje hasło

          mysql_real_escape_string(PlayerCache[playerid][pUsername], PlayerCache[playerid][pUsername]); // sprawdzanie, czy w nicku gracza nie ma niedozlownych znaków, w sumie nie potrzebne, ale nigdy za wiele bezpieczeństwa
          SHA256_PassHash(inputtext, "hSFaL3443", password, sizeof(password)); // ponownie hashowanie wpisanego hasła

          format(query, 128, "SELECT * FROM `players` WHERE `login` = '%s'", PlayerCache[playerid][pUsername]); // pobieranie id konta po podanym nicku
          mysql_query(query);
          mysql_store_result();

          if(mysql_fetch_row(query, "|")) // separator "|" oddziela pobrane dane z bazy
          {
               sscanf(query, "p<|>ds[32]s[65]",
                   PlayerCache[playerid][pUID],
                   PlayerCache[playerid][pUsername],
                   PlayerCache[playerid][pPassword]);
               }
               mysql_free_result();
             
              if(!strcmp(password, PlayerCache[playerid][pPassword])) // warunek, który sprawdza, czy wpisane jest zgodne z tym, co zostało pobrane z bazy danych
         {
                        print("zostales zalogowany poprawnie");
              }
              else
              {
                       print("podales bledne haslo");
              }
}


Głównie Twój błąd polegał na tym:

Kod: Zaznacz cały
if(strcmp(inputtext, PlayerCache[playerid][pPassword], false))


Warunek został źle skonstruowany. Jeśli masz jakieś pytania, czy problemy to śmiało pisz.
Obrazek
Za ten post autor Tiromaniak otrzymał polubienie od
Chief Reinoldo(23 sie 2016, o 12:22)
Avatar użytkownika
Tiromaniak
Weteran
 
Posty: 1002
Dołączył(a): 31 lip 2012, o 08:20
Polubionych : 10 razy
Otrzymał polubień: 569 razy

Re: Rejestracja i logowanie

Postprzez Chief Reinoldo » 23 sie 2016, o 12:21

Dzięki wielkie za to że aż tak się rozpisałeś, naprawdę to doceniam i szanuję :) Z pewnością mi się to przyda, kod już poprawiłem zgodnie ze wskazówkami, więcej nie popełnię takich błędów. Myślę że można zamknąć, jeżeli będę jeszcze kiedyś miał z czymś problem i nie będę potrafił go rozwiązać po wielu próbach to z pewnością się tutaj zgłoszę (ale mam nadzieję że tak nie będzie!), dzięki jeszcze raz.
Obrazek
Obrazek
Obrazek
Avatar użytkownika
Chief Reinoldo
Banned
 
Posty: 1137
Dołączył(a): 31 mar 2013, o 21:36
Lokalizacja: POD PARASOLEM
Polubionych : 261 razy
Otrzymał polubień: 208 razy


Powrót do Pomoc

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 1 gość