Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mechanizm sesji
Forum PHP.pl > Inne > Oceny
daniel1302
  1. <?php
  2. /********************************
  3. System obsługi sesji *
  4. Autor: Damned Land Team *
  5. Stworzono: 2007-03-13 19.05 *
  6. ********************************/
  7.  
  8. #Interfejs httpRequest
  9. interface _httpRequest
  10. {
  11. /*Konstruktor przpisze wartości*/
  12. public function __construct();
  13. /*Zwróć ip usera*/
  14. public function turnIp();
  15. /*Zwróć dane o systemach usera */
  16. public function turnBrowser();
  17. /*Test na bota*/
  18. public function checkBot();
  19. /*Destruktor klasy*/
  20. public function __destruct();
  21. }
  22.  
  23. #Interfejs Session
  24. interface _Session
  25. {
  26. /*Konstruktor klasy
  27. [(bool)$status]-TRUE(nietwozyc sesji anonimowego usera)*/
  28. public function __construct($status=false);
  29. /*Funkcja tworzy sesje*/
  30. public function create();
  31. /*Funkcja kończy sesje*/
  32. public function finalSession();
  33. /*Funkcja zwraca ID użytkownika sesji*/
  34. public function turnUserId();
  35. /*Sprawdza czy sesja jest aktywna i zwraca
  36. (bool)true lub (bool)false*/
  37. public function checkActiv();
  38. /*Zwraca id sesji*/
  39. public function turnSessId();
  40. /*Funkcja zrzucająca sesje do pliku 
  41. Zapisuje w sposób
  42. **|**|**|**|**
  43. [(string)$dir]-katalog dostępu*/
  44. public function dropToFile($toDir='./');
  45. /*Uaktualnij ostatnią wizyte*/
  46. public function sessionUpdate();
  47. }
  48.  
  49. #Klasa załaduje dane o użytkowniku
  50. Class httpRequest implements _httpReuest
  51. {
  52. #Wymagane zmienne
  53. #IP użytkownika
  54. private $ip;
  55. #Dane o przegląadarce i systemie
  56. private $browser;
  57. #test na bota
  58. private $scout;
  59.  
  60.  
  61. public function __construct()
  62. {
  63. $this -> ip = $_SERVER['REMOTE_ADDR'];
  64. $this -> browser = $_SERVER['HTTP_USER_AGENT'];
  65. $this -> scout = '';
  66. }
  67.  
  68. final public function turnIp()
  69. {
  70. return $this -> ip;
  71. }
  72.  
  73. final public function turnBrowser()
  74. {
  75. return $this -> browser;
  76. }
  77.  
  78. final public function checkBot()
  79. {
  80. $this -> scout = '/(googlebot|slurp@inktomi|ask jeeves|lycos|whatuseek|ia_archiver)/i';
  81. return ((preg_match($this->scout, $this->browser, $match)) ? true : false);
  82. }
  83.  
  84. public function __destruct()
  85. {
  86. unset($this->ip);
  87. unset($this->browser);
  88. unset($this->scout);
  89. }
  90. }
  91.  
  92. #Zdefiniuj stałe wartości
  93. #Nazwa SESJI
  94. define('COOKIENAME', 'PT_SESSION');
  95.  
  96.  
  97. #Klasa obsługi sesji
  98. Class Session implements _Session
  99. {
  100. public $request;
  101. private $test;
  102.  
  103. public function __construct($status=true)
  104. {
  105. #Odwołaj sie do klasy httpRequest;
  106. $this->request = new httpRequest;
  107. $this->test = @mysql_fetch_assoc(mysql_query("SELECT sess_id, sess_time, sessuser_id FROM session WHERE sess_id='".$_SESSION[COOKIENAME]."'"));
  108. #Sprawdz czy ma towyrzyć sesje
  109. if ($status==true && !isset($this->test['sess_time']))
  110. {
  111. $this->create();
  112. }
  113. }
  114.  
  115. public function create($user=0)
  116. {
  117. #AND jest wymagany bo gdy jest brak wpisu w bazie to $this->test zwraca 0=FALSE
  118. if (isset($this->test['sessuser_id']) && $this->test['sessuser_id'] == $user)
  119. {
  120. return false;
  121. }
  122. #Połącz czas oraz ip(można losowa liczba ale wtedy bedzie wieksza szansa na bug)
  123. $data = COOKIENAME.$this->request->turnIp();
  124. #Utwórz i zakoduj unikalne id z danych powyżej 
  125. $data = md5(uniqid($data));
  126. #Utwórz sesje z uniqid
  127. $_SESSION[COOKIENAME]=$data;
  128. #Stwórz indeks sesji w bazie
  129. if (isset($_SESSION[COOKIENAME]))
  130. {
  131. mysql_query("INSERT INTO session (sess_id, sessuser_id, sessuser_info, sessuser_ip, sess_time) 
  132. VALUES ('".$data."', 
  133. ".$user.", 
  134. '".$this->request->turnBrowser()."',
  135. '".$this->request->turnIp()."',
  136. ".time().")");
  137. }
  138. }
  139.  
  140. public function finalSession()
  141. {
  142. if (!isset($_SESSION[COOKIENAME]))
  143. {
  144. return false;
  145. }
  146. else
  147. {
  148. unset($_SESSION[COOKIENAME]);
  149. unset($this->test);
  150. unset($this->request);
  151. }
  152. }
  153.  
  154. public function turnUserId()
  155. {
  156. echo $this->test['sessuser_id'];
  157. }
  158.  
  159. public function turnSessId()
  160. {
  161. if ($_SESSION[COOKIENAME] != $this->test['sess_id'] || strlen($_SESSION[COOKIENAME]) != 32)
  162. {
  163. return false;
  164. }
  165. else
  166. {
  167. return $this->test['sess_id'];
  168. }
  169. }
  170.  
  171. public function checkActiv()
  172. {
  173. return (isset($_SESSION[COOKIENAME]) && isset($this->test['sess_time'])) ? true : false;
  174. }
  175.  
  176. public function dropToFile($toDir='./')
  177. {
  178. $fileName = $toDir.date('Y-m-d').'.txt';
  179. $file = @fopen($fileName, 'w');
  180. echo (!$file) ? false : true;
  181. $_query = mysql_query("SELECT * FROM session");
  182. fwrite($file, 'Zrzut sesji z dnia: '.date('Y-m-d H:i:s').', autor klasy do zrzutu daniel1302
  183. ID sesji|ID użytkownika|Dane o przeglądarce i systemie|IP użytkownika|Data utwor
    zenia|Ostatnia wizyta
  184. ');
  185. while($query = mysql_fetch_assoc($_query))
  186. {
  187. fwrite($file, ''.$query['sess_id'].'|'.$query['sessuser_id'].'|'.$query['sessuser_info'].'|'.$query['sessuser_ip'].'|'.$query['sess_time'].'|'.$query['sess_lastvisit'].'
  188. ');
  189. }
  190. fclose($file);
  191. }
  192.  
  193. public function sessionUpdate() 
  194. {
  195. mysql_query("UPDATE session SET sess_lastactiv=".time()." WHERE sess_id='".$this->test['sess_id']."'")
  196. }
  197. }
  198. ?>



OOP zajmuje się jakieś 3-4 tygodnie(Napisałem już trochę). Proszę o ocenę i pomoc co zmienić
Nie piszcie, że lepsze są ciasteczka, ponieważ to jest dla mnie lepsze.

Opisy funkcji macie w interfejsach oraz na stronie http://pastime.tivi.net.pl/team/php-files/...ead_id=246#2571
Ociu
Osobiście zrobił bym httpRequest jako klasę abstrakcyjną i Session powinno dziedziczyć.

Ps. Okomentowanie jest okropne...
daniel1302
Też bym tak zrobił, jak by mi ta klasa niebyła potrzebna do innych rzeczy
phpion
Moje uwagi:
1. Szalejesz z interfejsami, a (moim zdaniem) nie do konca rozumiesz ich zastosowanie (kontruktor? destruktor? po co to...).
2. turnIp? ObróćIp? Chyba returnIp lub getIp.
3. Użycie $_SERVER w klasie (niby to jeszcze obleci ale dla mnie to to samo co używanie $_POST/$_GET).
4. define - użyj stałych klasowych (const).
5. Zapytania SQL bez żadnych nakładek.
daniel1302
Czyli jak mam zastosować te interfjsy,
Zapytania mam zabezpieczone,
a co uzyc za miast $_SERVER
Ociu
httpRequest jeżeli dajesz do oceny, to nie jako cześć jakiegoś frameworka, tylko na potrzeby danej klasy, a na potrzeby tej klasy spokojnie jakby był klasą abstrakcyjną.
daniel1302
Może i lepiej, ale to jest wycięty fragment z mojego frameworka
MajareQ
Nie wspominając już o tym jaka jest ta klasa dziurawa... Session Fixation i Hij to nie wszystko... oO nawet SQL Incjetion winksmiley.jpg
Advance
$_SESSION[COOKIENAME] wypada przefiltrować, bo można podmienić wartość jej i dopisać coś w stylu DROP TABLE...
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.