[PHP] Skrypt logowania i sesja

<?

         mysql_connect ("...", "...", "...");

         mysql_select_db ("...");

         $nick = mysql_query('SELECT nick FROM '.$_POST['nick'].';');

         $pass = mysql_query('SELECT haslo FROM '.$_POST['nick'].';');

         $login = mysql_fetch_row($nick);

         $haslo = mysql_fetch_row($pass);

         if($login[0]!='' && $haslo[0]!='')

          echo('');

         if($login[0] && $haslo[0])

          if($haslo[0] != $_POST['pass'])

           echo('');

         if($login[0]!='' && $haslo[0]!='' && $login[0] == $_POST['nick'] && $haslo[0] == $_POST['pass'])

         {

          echo('Zalogowałeś się!');

          session_start();

	  if(!isset($_SESSION['kasa']))

	   {

	    $_SESSION['rekawice']= mysql_query('SELECT rekawice FROM '.$_POST['nick'].';');

	    $_SESSION['kasa']= mysql_query('SELECT kasa FROM '.$_POST['nick'].';');

	    $_SESSION['tarcza']= mysql_query('SELECT tarcza FROM '.$_POST['nick'].';');

	    $_SESSION['kamizelka']= mysql_query('SELECT kamizelka FROM '.$_POST['nick'].';');

	    $_SESSION['buty']= mysql_query('SELECT buty FROM '.$_POST['nick'].';');

	    $_SESSION['helm']= mysql_query('SELECT helm FROM '.$_POST['nick'].';');

	    $_SESSION['bron']= mysql_query('SELECT bron FROM '.$_POST['nick'].';');

	    $_SESSION['lvl']= mysql_query('SELECT lvl FROM '.$_POST['nick'].';');

	    $_SESSION['sila']= mysql_query('SELECT sila FROM '.$_POST['nick'].';');

	    $_SESSION['zrecznosc']= mysql_query('SELECT zrecznosc FROM '.$_POST['nick'].';');

	    $_SESSION['celnosc']= mysql_query('SELECT celnosc FROM '.$_POST['nick'].';');

	    $_SESSION['refleks']= mysql_query('SELECT refleks FROM '.$_POST['nick'].';');

	    $_SESSION['top']= mysql_query('SELECT top FROM '.$_POST['nick'].';');

	    $_SESSION['arena']= mysql_query('SELECT arena FROM '.$_POST['nick'].';');

            echo($_SESSION['rekawice'].$_SESSION['kasa'].$_SESSION['sila']);

	   }

         }

         echo('');

         echo('');

         echo('');

         echo('');

         echo('');

         echo('');

      ?>

[/code]

To jest prosty skrypt logowania, który potem tworzy sesje (jeśli dane są prawidłowe) i przypisuje dane w tablicy $_SESSION pobierając wartości z bazy danych. Po wpisaniu części z sesją i przypisywaniem wartości, skrypt przestał działać. Jak widać, jeśli by skrypt działał wypisał wartości dla rękawic, kasy i siły (czyli 0,0,0), ale nic nie pisze i nie działa system pokazujący błędy w logowaniu w zależności od przyczyny (brak hasła albo złe dane). Sesji wczoraj się nauczyłem, więc niezbyt się znam. W miarę możliwości oprócz rozwiązania problemu proszę o napisanie, jak skrypt powinien wyglądać, by działał szybciej i żeby odciążyć bazę SQL.

EDIT: narazie skrypt nie jest zabezpieczony przed atakiem sql injection ale potem to zrobię.

  1. KONIECZNIE filtruj dane, ale piszesz, że o tym wiesz;

  2. Koduj hasło w bazie danych;

session_start(); [/code]

umieść na początku pliku, przed wysłaniem jakichkolwiek danych do przeglądarki – to tylko utworzy sesję. Ustaw dodatkową zmienną sesyjną, informującą czy użytkownik jest zalogowany, np.

[code=php]$_SESSION[‘logged’] = true; 

  1. Po co dla każdego użytkownika tworzyć osobną tabelę w bazie? Stwórz jedną i dodawaj więcej rekordów dla kolejnych użytkowników, możesz identyfikować ich za pomocą loginu lub identyfikatora (z auto-increment np.). Z 14 zapytań dotyczących użytkownika możesz zrobić jedno. O korzyściach chyba nie muszę wspominać.

  2. Tak jak napisałem wyżej – po sprawdzeniu czy login i hasło się zgadza ustaw zmienną, ustalającą, że użytkownik jest zalogowany i dopiero wtedy wyświetlaj dane. Ponadto zapisz do sesji login użytkownika, i przy pobieraniu danych z bazy nie używaj danych pobranych z formularza, lecz z sesji. Co jeśli użytkownik wejdzie ponownie na stronę, a dane z formularza już nie będą dostępne?

  3. Pisz klamry przy warunkach, kod jest wtedy czytelniejszy. Używaj tabulatora, nie spacji :wink:

Zarys po naniesieniu poprawek

<?php();

Czyli ma być np tabela ‘users’ a w niej pola jak np monczkinhaslo, monczkinrekawice, budynsila? Jak w jednej tabeli mam posegregować tylu userów?

I czy haszowanie hasła jest potrzebne tylko przy logowaniu, czy też muszę dodać to do rejestracji?

Powariowałeś dla każdego usera inna tabela?

users

id|login|haslo|

1|zenek|bla

2|stefek|xyz

sprzety czy jakos tak

id|rekawice|buty|sila|user_id|

1|12|23|66|1

2|13|11|55|2

Co do tego co napisał Arek F. to jednak lepiej rozdzielić loginy i hasła od reszty rzeczy.

A jak będziesz chciał wybierać to poczytaj o Inner Join w mysql.

np. SELECT u.login AS login, s.sila AS sila FROM users AS u INNER JOIN sprzety AS s ON s.user_id=u.id

Hasło w bazie masz trzymać zaszyfrowane.

Więcej informacji znajdziesz w wyszukiwarce.