Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Cookie a sesja
Forum PHP.pl > Forum > Przedszkole
krystian19
Witam. Mam taki prosty system rejestracji i logowania użytkowników z bazy danych na swojej stronce. Wszystko działa poprawnie. Chciałbym jednak zrobić coś na styl autologowania aby użytkownik za każdym razem nie musiał wpisywać loginu i hasła, a został albo automatycznie zalogowany albo zostało mu już login i haslo wyświetlone, gotowe tylko do zatwierdzenia. Kombinowałem na różne sposoby z setcookie($login, $haslo, time()+9999); if(!isSet($_COOKIE['wyslane']) && !isSet($_POST['wyslane'])){ ale nic mi z tego nie wychodzi :/ Bardzo proszę o pomoc.

  1. <?php
  2. session_start(); // rozpoczecie sesji
  3. ?>
  4.  
  5.  
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  7. <title>stronka</title>
  8. <link rel="stylesheet" type="text/css" href="style.css" />
  9. <p><span class="styl2"><font face="Comic Sans MS" color="#006699">Zaloguj się</font></span><br>
  10. <div class="content2">
  11.  
  12. <?php
  13.  
  14. if (!isset($_SESSION['login'])) {
  15.  
  16. if ($_POST['wyslane']) {
  17.  
  18. include 'baza.php';
  19. $tabela = 'uzytkownicy';
  20.  
  21.  
  22. $login = $_POST["login"];
  23. $haslo = $_POST["haslo"];
  24.  
  25. setcookie($login, $haslo, time()+9999);
  26.  
  27.  
  28. $wynik=mysql_query("SELECT * FROM $tabela WHERE
  29. login='$login' and haslo='$haslo' and status=0");
  30.  
  31.  
  32. if (mysql_num_rows($wynik) == 1) {
  33. $info = mysql_fetch_array($wynik);
  34. echo '<span class="1">Nie aktywowałeś jeszcze konta</span>';
  35.  
  36. }
  37.  
  38.  
  39. $wynik=mysql_query("SELECT * FROM $tabela WHERE
  40. login='$login' and haslo='$haslo' and status=1");
  41.  
  42.  
  43. if (mysql_num_rows($wynik) == 1) {
  44. $info = mysql_fetch_array($wynik);
  45. $_SESSION["login"] = $info["login"];
  46. $_SESSION["imie"] = $info["imie"];
  47. $_SESSION["nazwisko"] = $info["nazwisko"];
  48. $_SESSION["image"] = $info["image"];
  49.  
  50. $last_login = date('YmdHis');
  51.  
  52.  
  53.  
  54. header('Location: index.php ');
  55. } else {
  56. echo '<span class="2">Zostały wprowadzone złe dane!</span>';
  57. }
  58. mysql_close($polaczenie);
  59. }
  60.  
  61.  
  62. echo <<< KONIEC
  63.  
  64.   <form class="form" action="logowaniee.php" method="post">
  65.   <input type="hidden" name="wyslane" value="TRUE" />
  66.  
  67.   <p>
  68. <div class="label"><label for="login"><font color="#000000">Login</font></label></div>
  69. <font color="#000000">
  70. <input type="text" name="login" id="login" />
  71. </font>
  72.  
  73. <p>
  74. <div class="label"><label for="haslo"><font color="#000000">Hasło</font></label></div>
  75. <font color="#000000">
  76. <input type="password" name="haslo" id="haslo" />
  77. </font>
  78.  
  79.   <p class="submit2">
  80.   <font color="#000000">
  81.   <input type="submit" value="Zaloguj mnie" />
  82.   </font>
  83.   </p>
  84.  
  85. <p class="przypomnij">
  86. <a href="przypomnieniee.php"><font color="#000000">Nie pamietasz hasła?</font></a>
  87. </p>
  88.  
  89.   </form>
  90. KONIEC;
  91.  
  92. } else {
  93. header('Location: index.php');
  94. }
  95.  
  96. if ($_GET["wylogowanie"] == "tak") {
  97.  
  98. header('Location: index.php');
  99. }
  100.  
  101. ?>
  102.  
  103.  
  104.  
  105. </div>
  106.  
  107. <p><br>
  108.  
  109.  


Znalazłem na internecie taką pomoc, w podobnej sprawie:


do formularza dodałem:
<input type="checkbox" name="autologin" value="1">

a do pliku
  1. <?php
  2. $suma_kontrolna=$_SESSION['login'].'_'.md5($_SESSION['login'].'!Q@W#E$R%T^Y&');
  3. if(isset($_POST['autologin'])) setcookie('autologin',$suma_kontrolna,time()+3600*24*14); // 14 dni
  4. ?>


  1. <?php
  2. if(isset($_COOKIE['autologin'])) {
  3. $tab=explode('_',$_COOKIE['autologin']);
  4. $suma_kontrolna=$tab[0].'_'.md5($tab[0].'!Q@W#E$R%T^Y&');
  5. if($suma_kontrolna==$_COOKIE['autologin']) $_SESSION['login']=$tab[0]; // Automatyczne logowanie
  6. }
  7. ?>


Po zalogowaniu (przy zaznaczeniu autologowania) - loguje się ok. Naciskam wyloguj. I teraz najważniejsze. Klikam w logowanie i automatycznie mnie loguje,czyli to o co mi chodziło, ale niestety nie jako dany użytkownik, tylko po prostu loguje.
Ponawiam prośbę o pomoc...

aachi
Nie bardzo wiem, gdzie u Ciebie jest problem. Podrzuć może aktualną wersję pliku, zamiast starą i informację, że gdzieś dodałeś jakiśtam kod.

Za to zauważyłem kilka innych rzeczy:
Tak troszkę dziwnie napisałeś ten swój skrypt. Niepotrzebnie wysyłasz dwa zapytania do bazy danych ( jedno ze status=0 i zaraz po nim to samo ze status=1). Nie lepiej wysłać jedno zapytanie i pobrać z wyniku ten status?

Zapisujesz w ciastku login i hasło (linia 26). Nie tylko jest to niebezpieczne, ale też zastanawiam się po co to robisz? Przecież masz je zapisane w bazie i nie widzę byś gdzieś to odczytywał później.

Wrzucasz też do zapytania sql dane bezpośrednio z $_POST. Dobrze jest użyć mysql_real_escape_string() na danych przesyłanych od użytkownika przed ich wrzuceniem do zapytania.

Wrzuć listing aktualnego kodu to może ktoś Ci pomoże.
krystian19
Witam, dzięki za rady AACHI. Ogólnie mój problem polega na tym, że chciałbym aby działało autologowanie. Nie wiem jak to zrobić prawidłowo, Kod który dorzuciłem ten z cookie po prostu skopiowałem. I to działa, niestety nie do końca. Mianowicie pierwszy raz loguje poprawnie, ale nastepnie już loguje ale nie jako dana osoba powiazana z sesją.
Zdaje sobie sprawę że zapisywanie ciasteczka jest niezbyt poprawne z uwagi na niebezpieczeństwo, ale nie mam innego pomysłu...
Podsumowując: - logowanie działa, chciałbym jednak, że za każdym razem jak dana osoba wejdzie na stronę będzie automatycznie zalogowana, aż do momentu kiedy naciśnie wyloguj.
Na chwile obecną jest zalogowana tylko na czas sesji.



  1.  
  2. <?php
  3. session_start(); // rozpoczecie sesji
  4. ?>
  5. <style type="text/css">
  6. <!--
  7. .styl2 {font-size: 18px}
  8. -->
  9. </style>
  10.  
  11. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  12. <title>stronka</title>
  13. <link rel="stylesheet" type="text/css" href="style.css" />
  14. <p><span class="styl2"><font face="Comic Sans MS" color="#006699">Zaloguj się</font></span><br>
  15. <div class="content2">
  16. 1.
  17. <?php
  18. $suma_kontrolna=$_SESSION['login'].'_'.md5($_SESSION['login'].'!Q@W#E$R%T^Y&');
  19. if(isset($_POST['autologin'])) setcookie('autologin',$suma_kontrolna,time()+3600*24*14); // DODANY KOD
  20. ?>
  21.  
  22.  
  23.  
  24.  
  25. <?php
  26.  
  27.  
  28.  
  29. if (!isset($_SESSION['login'])) {
  30.  
  31. if ($_POST['wyslane']) {
  32.  
  33. include 'baza.php';
  34. $tabela = 'uzytkownicy';
  35.  
  36.  
  37. $login = $_POST["login"];
  38. $haslo = $_POST["haslo"];
  39.  
  40.  
  41. if(isset($_COOKIE['autologin'])) {
  42. $tab=explode('_',$_COOKIE['autologin']);
  43. $suma_kontrolna=$tab[0].'_'.md5($tab[0].'!Q@W#E$R%T^Y&');
  44. if($suma_kontrolna==$_COOKIE['autologin']) $_SESSION['login']=$tab[0]; // Automatyczne logowanie DODANY KOD
  45.  
  46. }
  47.  
  48. $wynik=mysql_query("SELECT * FROM $tabela WHERE
  49. login='$login' and haslo='$haslo' and status=0");
  50.  
  51.  
  52. if (mysql_num_rows($wynik) == 1) {
  53. $info = mysql_fetch_array($wynik);
  54. echo '<span class="1">Nie aktywowałeś jeszcze konta</span>';
  55.  
  56. }
  57.  
  58.  
  59. $wynik=mysql_query("SELECT * FROM $tabela WHERE
  60. login='$login' and haslo='$haslo' and status=1");
  61.  
  62.  
  63. if (mysql_num_rows($wynik) == 1) {
  64. $info = mysql_fetch_array($wynik);
  65. $_SESSION["login"] = $info["login"];
  66. $_SESSION["imie"] = $info["imie"];
  67. $_SESSION["nazwisko"] = $info["nazwisko"];
  68. $_SESSION["image"] = $info["image"];
  69.  
  70. $last_login = date('YmdHis');
  71.  
  72.  
  73.  
  74. header('Location: index.php ');
  75. } else {
  76. echo '<span class="2">Zostały wprowadzone złe dane!</span>';
  77. }
  78. mysql_close($polaczenie);
  79. }
  80.  
  81.  
  82. echo <<< KONIEC
  83.  
  84.   <form class="form" action="logowaniee.php" method="post">
  85.   <input type="hidden" name="wyslane" value="TRUE" />
  86.  
  87.   <p>
  88. <div class="label"><label for="login"><font color="#000000">Login</font></label></div>
  89. <font color="#000000">
  90. <input type="text" name="login" id="login" />
  91. </font>
  92.  
  93. <p>
  94. <div class="label"><label for="haslo"><font color="#000000">Hasło</font></label></div>
  95. <font color="#000000">
  96. <input type="password" name="haslo" id="haslo" />
  97. </font>
  98. <input type="checkbox" name="autologin" value="1">Autologowanie
  99.   <p class="submit2">
  100.   <font color="#000000">
  101.   <input type="submit" value="Zaloguj mnie" />
  102.   </font>
  103.   </p>
  104.  
  105. <p class="przypomnij">
  106. <a href="przypomnieniee.php"><font color="#000000">Nie pamietasz hasła?</font></a>
  107. </p>
  108.  
  109.   </form>
  110. KONIEC;
  111.  
  112. } else {
  113. header('Location: index.php');
  114. }
  115.  
  116. if ($_GET["wylogowanie"] == "tak") {
  117.  
  118.  
  119. setcookie('autologin',false); //DODANY KOD
  120. header('Location: index.php');
  121. }
  122.  
  123. ?>
  124.  
  125.  
  126.  
  127. </div>
  128.  
  129. <p><br>
  130.  



aachi
Ja autologowanie robię tak, że jeśli ktoś zaznaczy podczas logowania, odpowiednią opcję, to zapisuję w bazie id użytkownika, przeglądarkę, czas wygaśnięcia autologowania i jakiś unikalny_ciąg. I ten unikalny ciąg zapisuję u użytkownika w ciastku.
Przy ponownym wejściu użytkownika (niezalogowanego oczywiście), sprawdzam czy istnieje odpowiednie ciastko z danymi. Jeśli istnieje to pobieram z bazy wiersz i sprawdzam czy dane się zgadzają. Jeśli nie wysyłam polecenie wygaśnięcia ciastka. Jeśli tak to ustawiam odpowiednie zmienne sesyjne.

Czyli w sumie robię to samo co i Ty próbujesz zrobić. smile.gif

Przeanalizowałem pobieżnie Twój kod i chyba znalazłem błąd...

Obecnie sprawdzasz czy ciastko "autologin" jest ustawione wyłącznie gdy $_POST['wyslane'] jest ustawione (a więc gdy ktoś skorzysta z formularza). No i jak pisałem... twój kod jest dziwny
Powinieneś mieć raczej:
  1. if (!isset($_SESSION['login'])) { //Jeśli user nie jest zalogowany to
  2. if ($_POST['wyslane']) { //Sprawdzamy czy user się loguje, jeśli tak to próbujemy go zalogować
  3. include 'baza.php';
  4. $tabela = 'uzytkownicy';
  5. $login = mysql_real_escape_string($_POST["login"]); //Zabezpieczamy się przed mysql injection
  6. $haslo = mysql_real_escape_string($_POST["haslo"]);
  7.  
  8. $wynik=mysql_query("SELECT * FROM $tabela WHERE login='$login' and haslo='$haslo' LIMIT 1") or die('Blad bazy!!!'); //Sprawdzamy czy istnieje osoba o takim loginie i hasle w bazie
  9. if (mysql_num_rows($wynik) == 1) { //Jeśli taka osoba istnieje to...
  10. $info = mysql_fetch_array($wynik);
  11. if ($info['status']==0) { //Sprawdzamy czy osoba ma status 0. Jesli tak to wyświetlamy komunikat o potrzebie aktywacji
  12. echo '<span class="1">Nie aktywowałeś jeszcze konta</span>';
  13. } elseif ($info['status']==1) { //Jeśli status=1 to logujemy osobę
  14. $_SESSION["login"] = $info["login"];
  15. $_SESSION["imie"] = $info["imie"];
  16. $_SESSION["nazwisko"] = $info["nazwisko"];
  17. $_SESSION["image"] = $info["image"];
  18. $last_login = date('YmdHis');
  19. header('Location: index.php ');
  20. }
  21. } else { //Jeśli nie ma w bazie usera o podanym loginie i hasle, to wyświetlamy komunikat
  22. echo '<span class="2">Zostały wprowadzone złe dane!</span>';
  23. }
  24. } else { //Jeśli user jest niezalogowany i nie skorzystał z formularza to sprawdzamy czy ma ustawione autologowanie
  25. if(isset($_COOKIE['autologin'])) { //Sprawdzamy czy istnieje ciastko
  26. $tab=explode('_',$_COOKIE['autologin']);
  27. if (md5($tab[0].'!Q@WE$R%T^Y&')==$tab[1]) { //Jeśli ciastko istnieje to sprawdzamy, czy dane w nim zapisane mają poprawny format
  28. //Poniżej logujemy użytkownika
  29. $login=mysql_real_escape_string($tab[0]); //Zabezpieczamy przed sql injection dane przesłane od usera w ciastku
  30. $wynik=mysql_query("SELECT * FROM $tabela WHERE login='$login' LIMIT 1") or die('Blad bazy!!!'); //Sprawdzamy czy istnieje osoba o takim loginie w bazie
  31. if (mysql_num_rows($wynik) == 1) { //Jeśli taka osoba istnieje to...
  32. $info = mysql_fetch_array($wynik);
  33. if ($info['status']==0) { //Sprawdzamy czy osoba ma status 0. Jesli tak to wyświetlamy komunikat o potrzebie aktywacji
  34. echo '<span class="1">Nie aktywowałeś jeszcze konta</span>';
  35. } elseif ($info['status']==1 { //Jeśli status=1 to logujemy osobę
  36. $_SESSION["login"] = $info["login"];
  37. $_SESSION["imie"] = $info["imie"];
  38. $_SESSION["nazwisko"] = $info["nazwisko"];
  39. $_SESSION["image"] = $info["image"];
  40. $last_login = date('YmdHis');
  41. }
  42. } else { //Jeśli nie ma w bazie usera o podanym loginie, to prawdopodobnie jest to próba włamania
  43. setcookie('autologin','',1); // kasujemy ciastko
  44. die(); //kończymy wykonywanie skryptu
  45. }
  46. }
  47. }
  48. }



To tak na szybko przerobiłem, bez sprawdzania czy nie ma błędów.... Przeanalizuj mój kod i swój i dokonaj odpowiednich poprawek.
Jeszcze raz zaznaczam, że mojego kodu nie uruchamiałem w PHP, więc nie wiem czy nie ma literówek lub innych błędów.
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.