Logowanie poprzez php oraz zabezpieczenie requestów.

0

Witam, tworzę aplikację w której użytkownicy logują się do bazy danych sql i dla bezpieczeństwa zamiast korzystać z mysql connectora i umieszczać hasło w kodzie, logowanie zrobiłem poprzez php.

W programie


                Dim request As HttpWebRequest = CType(WebRequest.Create("http://mojastrona.pl/login.php"), HttpWebRequest)
                request.Proxy = Nothing
                request.Method = "POST"
                request.ContentType = "application/x-www-form-urlencoded"
                Dim Post As String = ("username=" & username.Text & "&password=" & MD5_Encode(password.Text) & "&token=" & token & "&myhwid=" & myhwid)
                ...

W php


if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['token']) && isset($_POST['myhwid'])) {
    
     
        $login = addslashes($_POST['username']);
        $pass = addslashes($_POST['password']);
        $token = addslashes($_POST['token']);
        $myhwid = addslashes($_POST['myhwid']);
        
        $data = $db->QueryFetchArray("SELECT id,login,banned,activate,premium,myhwid FROM `users` WHERE (`login`='".$login."' OR `email`='".$login."') AND `pass`='".$pass."'");

Jak widać do php przekazuję login ,hasło zahashowane MD5, token i hwid.

hwid - jest to unikalny kod generowany na podstawie informacji o komputerze i przy pierwszym logowaniu jest przypisany do użytkownika i od tej pory, może się on zalogować na to konto tylko z tego komputera.

token - jest tworzony przy pierwszym uruchomieniu aplikacji i przy logowaniu zostaje przypisany do konta, i przy każdym requescie - php zwraca nowy token który jest porównywany z tym w aplikacji, przy kolejnym requeście i jeśli jest inny to aplikacja przestaje działać.

Jeżeli login i hasło zgadza się wtedy form2 się otwiera.

Gdy form 2 się otwiera zostają pobranie informacje o użytkowniku na podstawie loginu zapisanego w settings i tokenu który został wygenerowany podczas poprawnego zalogowania..

Czy waszym zdaniem jest to dobre zabezpieczenie aplikacji przed zhakowaniem i nie powołaną ingerencją do bazy danych ?

Czy podczas otwierania form 2 również powinienem logować się hasłem czy tylko loginem i tokenem?

0

Ja bym zrobił jeszcze sprawdzanie adresu IP, jeżeli się zmieni wygaszasz sesję.

Przesyłanie za każdym razem tokenu jest ok jeżeli z systemu nie będzie korzystać wielu użytkowników, w innym przypadku lepiej wygenerować token z określonym czasem ważności.

Podczas rejestracji konta generowałbym klucz API czyli stały token dorzucany do każdego zapytania razem z tokenem sesji (wygenerowanym podczas logowania). Wtedy jeżeli ktoś by przechwycił token logowania będzie jeszcze potrzebował klucz API żeby coś móc zrobić.

Jeżeli jednak przywiązujesz wagę do bezpieczeństwa to skorzystałbym z gotowych i sprawdzonych (zaudytowanych) rozwiązań ponieważ w kwestiach bezpieczeństwa najmniejszy błąd ma opłakane skutki.

0

Jeszcze jedno pytanie. Gdy nastąpi poprawne zalogowanie to generuję token który przypisuję w bazie do użytkownika i nie zmienia się aż do kolejnego logowania. Po zalogowaniu otwiera się program właściwy i pobieram dane o użytkowniku za pomocą loginu zapisanego w settings i tokenu. Czy powinienem też dodać hasło? Czyli login + hasło + token?

0

Ja bym zrobił to tak:

  1. Rejestracja użytkownika - dodajesz usera, hasło oraz generujesz klucz API który user zapisuje sobie lokalnie.
  2. Logowanie - użytkownik przesyła login + hasło + klucz API a serwer zwraca token sesji - token jest losowym ciągiem i nie ma związku z danymi użytkownika.
  3. Zapytanie - przesyłasz token sesji oraz klucz API i na ich podstawie uwierzytelniasz użytkownika. Jeżeli sesja wygasa to usuwasz token po stronie serwera i każdy request z nim będzie odrzucany.
0

Rejestracja jest możliwa tylko przez stronę. Niestety mam już pewna ilość zarejestrowanych użytkowników i generowanie klucza api podczas rejestracji odpada.
Może wystarczający będzie ten sposób?

  1. Użytkownik loguje się podaje login + hasło, gdy dane są poprawne generuję losowy siąg znaków i zapisuję jako token w bazie i w settings.
  2. Otwiera się program właściwy pobieram dane użytkownika za pomocą loginu + tokenu. php zwraca dane + nowy token.
  3. Zapytanie Pobieram dane/zapisuję za pomocą loginu + tokenu który za każdym requestem będzie inny.
    Może być?
0
  1. Tak, tylko niech ten ciąg będzie odpowiednio długi,
  2. Loginu już nie przesyłaj - sam token i na serwerze sprawdzasz do jakiego użytkownika jest przypisany.

Możesz generować dla każdego requestu nowy token chociaż nie jest to zbyt często spotykana praktyka - najczęściej token jest ważny przez określony czas + serwer sprawdza parametry połączenia i w przypadku podejrzanych zapytań unieważnia token. Jeżeli np. zerwie połączenie, zgubi się pakiet itp. co za każdym razem użytkownik będzie musiał się logować żeby zdobyć nowy token.

0

Token generuję na końcu zapytania php i powraca on do programu i jest porównywany, dlaczego tak robię? ponieważ obawiam się że ktoś może sprawdzić adres requestu np w wireshark i zobaczy coś takiego:
http://mojastrona.pl/save.php?
pageid=456&money=5&token=i567df89sd8f78sd
Powiedzmy że tu ma dodać mi do konta 5 więc ktoś może podmieniać pageid i poza programem wysyłać requesty ewentualnie mogę zaszyfrować te dane tj pageid i money. ale w jaki sposób?

0

Takich danych nie przesyła się w URL z tego powodu, jaki wymieniłeś. Poza tym robisz to zapewne jako GET, który ma ograniczenie ilości znaków. Przesyłaj ten dane w nagłówku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1