Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Nieoczekiwane wylogowanie z sesji
Forum PHP.pl > Forum > Przedszkole
Matt23
Witam grono,
coś tam sobie amatorsko tworzę i natrafiłem na problem, kiedy to skrypt samoczynnie wylogowuje mnie z aktywnej sesji w momencie próby zmiany nazwy innego usera, na taką, z jakiej korzysta obecny user.
Może przedstawię kod:

  1. elseif (isset($_GET['admin']) && $_GET['admin'] == 'edited' && isset($_GET['id']))
  2. {
  3. $submit = $_POST['submit'];
  4. $save = "Save";
  5. $delete = "Delete";
  6. $name = $_POST['user'];
  7. $haslo = $_POST['haslo'];
  8. $ip = $_POST['ip'];
  9. $data = $_POST['data'];
  10. $czas = $_POST['czas'];
  11. $id = $_GET['id'];
  12. if ($submit == $save)
  13. {
  14.  
  15. //kodowanie hasła
  16.  
  17.  
  18. $istnick2 = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM admins WHERE `nick` = '$name'"));
  19. if ($istnick2[0] == 1) {
  20. echo '<div id="content"><h3>Username zajęty</h3></div>';
  21. }
  22. else {
  23.  
  24. mysql_query("UPDATE `admins` SET nick='$name', haslo='$haslo', ip='$ip', data='$data', czas='$czas' WHERE id='$id'");
  25. $status = "password_changed";
  26. mysql_query("INSERT INTO logs (`user`, `status`, `ip`, `data`, `time`) VALUES ('$name', '$status', '" . $_SERVER['REMOTE_ADDR'] . "', '" . date('d-m-Y') . "', '" . date('H:i:s') . "')");
  27. $_SESSION['haslo'] = $haslo;
  28. $_SESSION['nick'] = $name;
  29.  
  30. echo '<div id="content"><h3>Dane zapisane</h3></div>';
  31. }
  32. }
  33.  
  34. elseif ($submit == $delete)
  35. {
  36.  
  37. //kasowanie admina
  38. }
  39. }


Jak widać w liniach 18-21 w wypadku stwierdzenia, że nick jest zajęty, skrypt ma zwrócic tylko komunikat. Dalsza część instrukcji nie wykonuje się więc nie powinno dochodzić do nadpisywania sesji.

Tak wyglądają pierwsze linijki kodu odpowiedzialne za sprawdzenie sesji:

  1. $nickSesja = $_SESSION['nick'];
  2. $hasloSesja = $_SESSION['haslo'];
  3.  
  4. if ((empty($nickSesja)) AND (empty($hasloSesja)))
  5. {
  6. echo '<br />Nie byłeś zalogowany albo zostałeś wylogowany<br /><a href="index.php">Strona Główna</a><br />';
  7. }
  8.  
  9. $user = mysql_fetch_array(mysql_query("SELECT * FROM admins WHERE `nick`='$nickSesja' AND `haslo`='$hasloSesja' LIMIT 1"));
  10.  
  11. if (empty($user['id']) OR !isset($user['id']))
  12. {
  13. echo '<h3>Nieprawidłowe logowanie</h3>';
  14. echo '<a href="index.php"><h4>Zaloguj się ponownie</h4></a>';
  15. }


Wartości dla sesji są też nadawane w pliku logowanie, ale to chyba nie istotne.

Więc sytuacja wygląda tak, że gdy chcę zmienić nick userowi na taki jaki mam obecnie ja - zalogowany (załóżmy userowi Marek zmieniam nick na mój - np. Andrzej) to skrypt po sprawdzeniu, że taki nick istnieje zgodnie z instrukcją warunkową wyświetla stosowną informację i na tym się kończy.
Gdy jednak kliknę w którąkolwiek dostępną opcję po otrzymaniu tego komunikatu (np. opcję wyświetlenie adminów, logów, itp.) dostaję komunikat, że jestem nieprawidłowo zalogowany (linijki 12-17 drugiego kodu). Nie ma takiego problemu, jeśli próbuję zmienić nickname na jakiś dostępny.
Dodam, że nie jestem autorem kodu na logowanie z sesjami, więc jeśli ma on jakieś rażące błędy prosiłbym o wskazanie mi ich.
ZaXaZ
w linijkach 27, 28 zmieniasz sobie nick i haslo sesji

  1. $_SESSION['haslo'] = $haslo;
  2. $_SESSION['nick'] = $name;
Matt23
@up

Tak wiem, ta funkcja jest niedopracowana jeszcze, ale zapisuje dane i zmienia aktualnie zalogowanego usera (do poprawy).
Natomiast zauważyłem, że error następuje kiedy chcę zmienić nazwę usera na jakąkolwiek inną w użyciu.
Zwróć uwagę, że w tej sytuacji nie wykonują się linijki 27 i 28, wiec to czym bardziej nie jest wina tego else{}.
Pyton_000
Sprawdź co zwraca $istnick2 przy zmianie na istniejący nick
Matt23
Siedzę nad tym całe popołudnie i trzaskam w klawiaturę, ale nic nie rozumiem. Z resztą sobie poradziłem ale zostało mi to wylogowywanie.

  1. elseif (isset($_GET['admin']) && $_GET['admin'] == 'edited' && isset($_GET['id']))
  2. {
  3. //pobieranie zmiennych
  4.  
  5. $id = $_GET['id'];
  6.  
  7. $result5 = mysql_fetch_array(mysql_query("SELECT * FROM admins WHERE nick='$name'")); //sprawdza czy nick jest zajęty
  8. $nickistnieje=$result5['nick'];
  9.  
  10. $result2 = mysql_fetch_array(mysql_query("SELECT * FROM admins WHERE id='$id'")); //pobiera aktualny nick edytowanego usera
  11. $nickadmina = $result2['nick'];
  12.  
  13. $admloggedNick = $_SESSION['nick']; //nick zalogowanego usera
  14. $result3 = mysql_fetch_array(mysql_query("SELECT * FROM admins WHERE nick='$admloggedNick'")); //ID zalogowanego usera
  15. $admlogged=$result3['id'];
  16.  
  17.  
  18. if ($submit == $save)
  19. {
  20.  
  21. //kodowanie hasła
  22.  
  23. if (!empty($nickistnieje) && $nickadmina !== $nickistnieje) { //czy nick istnieje i czy nie jest taki sam jak edytowanego usera
  24.  
  25.  
  26. echo '<div id="content"><h3>'.$nickistnieje.' <br>'.$name.'<br>'.$nickadmina.'</h3></div>'; //testowanie poprawności
  27. echo '<div id="content"><h3>Ten username jest zajęty</h3></div>';
  28. }
  29. elseif ((!empty($nickistnieje) && $nickadmina == $nickistnieje) || (empty($nickistnieje) && $nickadmina !== $nickistnieje)) { //jeśli nick dostępny lub bez zmian nicku
  30.  
  31. mysql_query("UPDATE `admins` SET nick='$name', haslo='$haslo', ip='$ip', data='$data', czas='$czas' WHERE id='$id'");
  32. $status = "password_changed";
  33. mysql_query("INSERT INTO logs (`user`, `status`, `ip`, `data`, `time`) VALUES ('$name', '$status', '" . $_SERVER['REMOTE_ADDR'] . "', '" . date('d-m-Y') . "', '" . date('H:i:s') . "')");
  34.  
  35. if($id == $admlogged){ //jeśli zalogowany admin edytował swoje dane
  36.  
  37. $_SESSION['haslo'] = $haslo;
  38. $_SESSION['nick'] = $name;
  39. echo '<div id="content"><h3>Dane zapisano</h3></div>';
  40. }
  41. elseif($id !==$admlogged) { //jeśli zalogowany edytował cudze dane
  42.  
  43. echo '<div id="content"><h3>Dane zapisano</h3></div>';
  44. }
  45.  
  46. }
  47. }
  48.  
  49. elseif ($submit == $delete) //kasowanie usera
  50. {
  51. $admloggedNick = $_SESSION['nick']; //nick zalogowanego
  52. mysql_query("DELETE FROM admins WHERE id='$id' LIMIT 1");
  53. if($id == $admlogged) //jeśli user skasował swoje konto
  54. {
  55. $status = "account_deleted";
  56. mysql_query("INSERT INTO logs (`user`, `status`, `deleted_by`, `ip`, `data`, `time`) VALUES ('$name', '$status', '$name', '" . $_SERVER['REMOTE_ADDR'] . "', '" . date('d-m-Y') . "', '" . date('H:i:s') . "')");
  57.  
  58. header("Location: logout.php"); //wylogowanie
  59. }
  60. elseif($id !== $admlogged){ //jeśli skasował nieswoje konto
  61. $status = "account_deleted";
  62.  
  63.  
  64. mysql_query("INSERT INTO logs (`user`, `status`, `deleted_by`, `ip`, `data`, `time`) VALUES ('$name', '$status', '$admloggedNick', '" . $_SERVER['REMOTE_ADDR'] . "', '" . date('d-m-Y') . "', '" . date('H:i:s') . "')");
  65. echo '<div id="content"><h3>'.$admloggedNick.'</h3></div>'; //test zmiennych
  66. echo '<div id="content"><h3>Account has been deleted</h3></div>';
  67. }
  68. }
  69. }


Wychodzi na to, że kiedy edytuję jakiegoś innego usera (linijki 29-33 i 41-43) to skrypt sam wrzuca mi jego zakodowane hasło do mojej sesji i mnie wylogowuje. Gdy edytuję swoje dane (linijki 31-40) wszystko jest ok. To samo gdy kasuję innego usera, (linjki 52 i 60-69) skrypt wrzuca mi jego hasło do mojej sesji.

Ok, poradziłem sobie zmieniajac nazwy wszystkich $haslo w tym elseif{} na jakąś inną nazwę. Najwyraźniej z jakichś nieznanych mi przyczyn sesje upodobały sobie $haslo.
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.