Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z wylogowaniem
Forum PHP.pl > Forum > Przedszkole
arzach
Witam napisałem prosty skrypt logowania i mam problem z wylogowaniem. Mimo że podczas wylogowania $_COOKIE['user'] jest usuwane to dalej istnieje. I nie można się wylogować.
Plik logowanie
  1. if (isset($_COOKIE['user']))
  2. {
  3. $result = mysql_query("SELECT * FROM uzytkownicy WHERE id='".$_COOKIE['user']."' LIMIT 1");
  4. if (mysql_num_rows($result)) {
  5. $userdata = mysql_fetch_assoc($result);
  6. }
  7. }
  8.  
  9.  
  10. if(isset($_POST['iduzytkownika']) && isset($_POST['haslo']))
  11. {
  12.  
  13. $user_name = $_POST['iduzytkownika'];
  14. $user_pass = $_POST['haslo'];
  15.  
  16. $result = mysql_query("SELECT * FROM uzytkownicy WHERE nick='".$user_name."' AND haslo='".$user_pass."' LIMIT 1");
  17. if (mysql_num_rows($result)) {
  18. $data = mysql_fetch_assoc($result);
  19. setcookie("user", $data['id'], time() + 3600 * 24 * 30, "/", "", "0");
  20. } else {
  21. echo 'Podane haslo lub login jest nie poprawny';
  22. }
  23. }
  24.  
  25. if (isset($_COOKIE['user']))
  26. {
  27. echo 'Użytkownik zalogowany jako: '.$userdata['nick'].'<br />';
  28. echo '<a href="wylog.php">Wylogowanie</a><br />';
  29. }
  30. else
  31. {
  32. // tworzenie formularza logowania
  33. echo '<form method="post" action="'.basename($_SERVER['PHP_SELF']).'">';
  34. echo '<table>';
  35. echo '<tr><td>Identyfikator użytkownika:</td>';
  36. echo '<td><input type="text" name="iduzytkownika"></td></tr>';
  37. echo '<tr><td>Hasło:</td>';
  38. echo '<td><input type="password" name="haslo"></td></tr>';
  39. echo '<tr><td colspan="2" align="center">';
  40. echo '<input type="submit" value="Logowanie"></td></tr>';
  41. echo '</table></form>';
  42. }
  43.  

Plik odpowiedzialny za wylogowanie
  1. <?php
  2. header("P3P: CP='NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM'");
  3. setcookie("user", "", time() - 3600 * 24 * 30, "/", "", "0");
  4. header("Location: ".str_replace("&", "&", 'logowanie.php'));
  5. ?>
kartin
Sprawdź
  1. unset($_COOKIE['user']))
arzach
Dalej to samo już wcześniej unset próbowałem i nic.
gothye
jeśli już to ciasteczka usuwasz tak :
  1. setcookie("user", $data['id'], time() - 3600 * 24 * 30, "/", "", "0");
arzach
Dalej nic z tego. Nie mam pojęcia, czemu nie chce się usunąć.
gothye
moze zmien paramete securee ( "0" ) na NULL
arzach
Dalej to samo nie da się usnąć.
netmare
Ja mam propozycję żebyś to napisał od nowa z użyciem sesji. Pomijając kwestię problemu z usunięciem ciasteczka z przeglądarki pozostają kwestie bezpieczeńswa.


  1. $result = mysql_query("SELECT * FROM uzytkownicy WHERE id='".$_COOKIE['user']."' LIMIT 1");

To jest mocno podatne na iniekcję sql, zresztą sprawdzanie loginu i hasła też. Chyba że masz magic_quotes włączone.

Do tego nie potrzeba wcale się logować żeby być zalogowanym. Oznacza to że jeśli rozszerzysz skrypt o rozpoznawanie jakiegoś admina od zwykłych userów to kwestia znalezienia jego id to będą najwyżej pojedyncze minuty.

Proponuję przynajmniej napisać na początku tego pliku i wszystkich innych session_start() i używania $_SESSION zamiast $_COOKIE oraz upewnienie się że jest włączone magic_quotes_gpc. A docelowo radzę poczytać więcej o sesjach i sposobach ataków na nie, a także SQL Injection.
thek
Netmare... Magic_quotes to złe rozwiązanie. Mi osobiście tyle krwi już napsuło, że głowa boli. Jak programista powinieneś kontrolować co jest escape'owane, a co nie, bo czasem jest to uszczęśliwianie na siłę. Wrzucasz tekst, chcesz go "czysty", a się okazuje, że na dzień dobry masz go już poprawionego i musisz go przywracać do starej formy bo taką masz dyrektywę domyślnie ustawioną i nie możesz jej zmienić ani w htaccess, ani nijak, tylko musisz wykrywać czy jest włączona i reagować odpowiednio.

Do autora zaś tematu. Co z tego, że niby ciacho usuwasz, skoro w kodzie nie widzę jego niszczenia? Inna sprawa, że ciacho działa nawet z datą przeszłą do czasu zamknięcia strony Do tego czasu sprawdzanie poprzez isset zwróci nam true. Ja już co sprawdzaj wartość w nim zaszytą, czy jest prawidłowa, bo powinna być większa niż aktualny czas. Jeśli nie jest... ważność się skończyła.
netmare
@ thek

nie uznaję MQ, starałem się tylko wskazać mocno początkującemu koledze podstawowe luki w zabezpieczeniach, bez niepotrzebnych na jego poziomie wywodów winksmiley.jpg
erix
Ale w PHP6 MQ nie będzie, więc wywody są potrzebne. winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.