Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt logowania Session,Cookis, prośbą o analizę...
Forum PHP.pl > Forum > PHP
Avatarus
Witam
Próbuje napisać sprawny kod logowania z cookies opartym oczywiście o sesje i bazę danych mysql.
Jednak coś nie działa mi to w necie, bo lokalnie zdaję się że działa.

Mam jeszcze dodatkowe pytanie, czy da się jakoś sztucznie wydłużyć czas trwania SESSION? Typ serwera Home.pl, konto współdzielone, więc nie mam dostępu do php.ini

Oto zestaw plików odpowiedzialnych za logowanie u mnie.

Plik funkcje.php
  1. <?php
  2. require_once 'sterownik.php'; //cache
  3. $host='localhost';
  4. $user='xxxxxx';
  5. $haslo='xxxxxx';
  6. $baza='xxxxx';
  7.  
  8.  
  9. //LOGOWANIE 
  10. //logowanie_cookies();
  11.  
  12.  
  13. function polaczenie()
  14. {
  15. global $host,$user,$haslo,$baza;
  16. $lacz=mysql_connect($host,$user,$haslo);
  17. $polecenie=mysql_query($lacz);
  18. $baza_danych=mysql_select_db($baza);
  19. $polecenie=mysql_query($baza_danych);
  20. }
  21. function wczytaj_ustawienia()
  22. {
  23. polaczenie();
  24.  $zapytanie=mysql_query('Select * from scms_ustawienia');
  25.  $ustawienia=mysql_fetch_assoc($zapytanie);
  26.  return $ustawienia;
  27. }
  28. function generuj_id_sesji()
  29. {
  30. $id_sesji=rand(0,20).sha1(date('U')).rand(0,50);
  31. return $id_sesji;
  32. }
  33. function logowanie_cookies()
  34. {
  35. //echo 'Logowanie cookies<br>';
  36. if (!empty($_COOKIE['tajnecookie']))
  37. {
  38. //echo 'jest cookies<br>';
  39. $id_sesji=$_COOKIE['tajnecookie'];
  40. $test_session=sprawdz_sesje($id_sesji);
  41.  
  42. }
  43. else
  44. {
  45. //echo '<br>nie ma cookies<br>';
  46. }
  47.  
  48. }
  49. function sprawdz_sesje($id)
  50. {
  51. //echo '<br>sprawdzanie cookies<br>';
  52. polaczenie();
  53. $zapytanie = "select * from scms_sesje where session_id='".$id."'";
  54. //echo $zapytanie;
  55. $wynik = mysql_query($zapytanie);
  56. $dane=mysql_fetch_assoc($wynik);
  57. //echo "<br>Strona:".$_SERVER[HTTP_USER_AGENT].'<br>Baza:'.$dane['browser'].'<br>';
  58. if(mysql_num_rows($wynik)!=0 and ($_SERVER[HTTP_USER_AGENT]==$dane[agent]))
  59. {
  60. //echo '<br>Sesja z bazy:'.$dane[session_id].'<br>';
  61. //echo '<br>Jest taka sesja w bazie<br>';
  62. $_SESSION['uwierzytelniony'] = $dane['login'];
  63. $_SESSION['user_poziom']=$dane['user_level'];
  64. $_SESSION['id']=$dane['user_id'];
  65. return $dane;
  66. }
  67. else
  68. {
  69.  //echo '<br>Nie ma takiej sesji w bazie<br>';
  70.  return 0;
  71. }
  72. }
  73. function czyszczenie_tabeli_sesji()
  74. {
  75. if (date('H')==23 and date('i')>45)
  76. {
  77. $czas=date(U)-(60*60*24*30);
  78. $sql='DELETE from scms_sesje where czas<"'.$czas.'"';
  79. }
  80. }
  81. ?>


plik index.php
  1. <?php
  2. require 'funkcje.php';
  3.  
  4. polaczenie();
  5. $ustawienia=wczytaj_ustawienia();
  6.  
  7. if ($ustawienia[status]=="OFF") 
  8. {
  9. require ('strona_off.php'); exit;
  10. }
  11.  
  12. else
  13. {
  14. if (!$_SESSION['uwierzytelniony'] and !$_SESSION['user_poziom'] and !$_SESSION['id']) logowanie_cookies();
  15. header ('Location: news.php');
  16.  
  17. }
  18. ?>

Plik logout.php
  1. <?php
  2. require 'funkcje.php';
  3. function wyloguj($id)
  4. {
  5.  
  6. polaczenie();
  7. $zapytanie = mysql_query("delete from scms_sesje where session_id='".$id."'");
  8. unset($_SESSION['uwierzytelniony']);
  9. unset($_SESSION['user_poziom']);
  10. unset($_SESSION['id']);
  11. setcookie('tajnecookie','',time()-100,'','',0);
  12. header ('Location: index.php');
  13. }
  14. wyloguj($_COOKIE['tajnecookie']);
  15. ?>

Plik logowanie.php
  1. <?php
  2. if(isset($_POST['login']) and isset($_POST['haslo']))
  3. {
  4. $iduzytkownika = $_POST['login'];
  5. require_once ('funkcje.php');
  6. polaczenie();
  7. $zapytanie = "select ID_MEMBER,memberName,ID_GROUP,passwd,emailAddress from 
  8. smf_members where memberName='".$iduzytkownika."' and passwd='".sha1(strtolower($iduzytkownika).$_POST[haslo])."'";
  9. $wynik = mysql_query($zapytanie);
  10. $dane=mysql_fetch_assoc($wynik);
  11. $jest_user=mysql_num_rows($wynik);
  12. if($jest_user > 0)
  13. {
  14. $polecenie=mysql_query('SELECT name from smf_ban_groups where name="'.$dane[memberName].'"');
  15. $warnow=mysql_fetch_array($polecenie);
  16. if (mysql_num_rows($polecenie)>0)
  17. {
  18. unset($_SESSION['uwierzytelniony']);
  19. unset($_SESSION['user_poziom']);
  20. unset($_SESSION['id']);
  21. header ('Location: ban.php');
  22. }
  23. else
  24. {
  25.  $_SESSION['uwierzytelniony'] = $dane[memberName];
  26. $_SESSION['user_poziom']=$dane['ID_GROUP'];
  27. $_SESSION['id']=$dane['ID_MEMBER'];
  28. $wygenerowane_id=generuj_id_sesji();
  29. $sql=mysql_query('DELETE from scms_sesje where login="'.$_SESSION[uwierzytelniony].'"');
  30. $sql=mysql_query('Insert Into scms_sesje values (NULL,''.$wygenerowane_id.'',''.$dane[memberName].'',''
  31. .$dane['ID_MEMBER'].'',''.$dane['ID_GROUP'].'',''.$_SERVER[HTTP_USER_AGENT].'',''.date(U).'')');
  32. setcookie('tajnecookie',$wygenerowane_id,time()+60*60*24*30,'','',0);
  33. czyszczenie_tabeli_sesji();
  34.  
  35. header ('Location: index.php');
  36.  
  37. }
  38. }
  39. else
  40. {
  41. header ('Location: news.php');
  42. }
  43. }
  44. else header ('Location: news.php');
  45. ?>


w nagłówku zaraz po body jest wywołanie funkcji:
  1. <?php
  2. if (!isset($_SESSION[uwierzytelniony])) logowanie_cookies();
  3. ?>


Skrypt pisałem jakiś czas temu, mam świadomość że jest trochę chaotyczny smile.gif Jeśli jednak macie jakieś pomysły jak temu zaradzić. Nie trzeba tu nigdzie przypadkiem zregenerować id sesji? Tylko jak i gdzie? Będę wdzięczny za pomoc.
Pozdrawiam
.radex
Oj chłopie, trochę za dużo tego kodu, żeby ktoś za Ciebie analizował go.

Przeanalizuj w różnych miejscach (np. za pomocą var_dump) dane to będzie wiadomo gdzie się coś nie zgadza. Wtedy będzie łatwo zlokalizować błąd.

I posprawdzaj sobie za pomocą mysql_error czy zapytania są ok.
Avatarus
tak tylko wiesz.....sesje z cookies możesz sprawdzić tylko jak sesja wygasa i wtedy zobaczyć czy faktycznie łapie ją znowu z cookies czy nie. Czekanie powiedzmy 20 min i sprawdzenie czy sesja zaskoczyła z każdą poprawką to nieciekawe doświadczenie.

Może w wielkim skrócie. Skrypt działa tak. Jak się logujesz to do bazy wędruje id sessji wygenerowany przez moja funkcje, dodatkowo, czas, id usera, nick. Wysyłane jest też cookies ktore ma w sobie tylko id sesji.
Jeśli teraz podczas odświeżenia nie ma $_SESSION[nick] (czyli wygasła) to odpala funkcje logowanie_cookies()
Te funkcja sprawdza czy jest cookies, potem sprawdza czy Id w nim pasuje do tabeli sesji jeśli tak to przypisuje zmiennym $_SESSION nowe dane.

z funkcji sesyjnych używam tylko session_start(), session_destroy(). Wiem że są funkcje to regeneracji id, ale nie wiem czy przyda się to tutaj....
Może inaczej. Jeśli ktoś stworzy sesje i są przechowywane dane np. $_SESSION[nick] no i powiedzmy po 10 latach koleś odświeży stronę, dane $_SESSION wygasną, no ale jest cookies, sprawdzi z bazą i jest sesja, to wtedy z marszu przypiszę nowe dane $_SESSION to będzie to dalej poprawna sessja? czy trzeba całą sesję jakoś odrodzić?
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.