Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Co trzymać w $_SESSION po zalogowaniu?
Forum PHP.pl > Forum > PHP
macandy
Mam pewne wątpliwości związane z bezpieczeństwem wartości trzymanych w sesji. Czy jest możliwość ustawiania/edytowania takich wartości z zewnątrz, spoza skryptu?


Żeby bardziej zobrazować o co mi chodzi nakreślę to może pokrótce na konkretnym przykładzie.

Obecnie żeby dostać się do panelu użytkownika mam ustawiony tylko jeden warunek isset($_SESSION['userid']), a jeżeli zwróci true to panel się otwiera i wszelkie akcje są podejmowane dla konkretnego userid. Zastanawiam się jednak, czy jest to wystarczająco bezpieczne. Czy jest możliwe ustawienie tego identyfikatora zewnętrznie (w skrypcie pobieram go z bazy danych jezeli login i haslo się zgadzają) i podszywanie się pod jakiegoś użytkownika? Czy nie powinienem dodatkowo trzymać jeszcze hasła danego użytkownika i sprawdzać za każdym razem w bazie czy identyfikator i hasło się zgadzają?
Shili
Jest możliwe wykradzenie na przykład ciastka z identyfikatorem sesji. Jest możliwość zalogowania się na z góry ustalony identyfikator (przed tym chroni session_regenerate_id()), jest jeszcze parę ciekawych możliwości uzyskania sesji innego użytkownika włącznie z atakami socjotechnicznymi. Z tego co wiem póki nie ma możliwości ataku xss nie ma również możliwości ustawienia nowych zmiennych sesyjnych ani edytowania starych.

Ogólnie często sprawdza się jeszcze user agent czy ip. Podstawą jest korzystanie z wymienionego session_regenerate_id() i zabezpieczanie przed wstrzyknięciem kodu na stronę.
macandy
Dzięki, szukałem trochę na necie ocb z tą funkcjią, ale nadal nie wiem jak mam to wrzucić do kodu. Obecnie mam przy każdej stronie:

  1. <?php
  2.  
  3. if(($_SESSION['lastRefresh']+$this->timeout) < time())
  4. unset($_SESSION['userid']);
  5. $_SESSION['lastRefresh'] = time();
  6. ?>


Z kolei na stronie panelu użytkownika wygląda to tak:

  1. <?php
  2.  
  3. (isset($_SESSION['userid']))
  4. or error('Dostęp do panelu mają tylko zalogowani użytkownicy!','index.php'); // wyrzuca błąd i przekierowuje do index.php
  5.  
  6. if(($_SESSION['lastRefresh']+$this->timeout) < time())
  7. unset($_SESSION['userid']);
  8. $_SESSION['lastRefresh'] = time();
  9. ?>



Jak zatem widać sprawdzam aktywność użytkownika na stonie. Jeśli za długo był nieaktywny to wylogowuje go kasując userid z sesji. Do panelu ma dostęp tylko użytkownik z ustawionym userid w sesji. Czy zatem będzie dobrze tak:

  1. <?php
  2.  
  3. if($_SESSION['userid']){
  4. unset($_SESSION['userid']);
  5. error('Proszę o ponowne zalogowanie się!','index.php');
  6. }
  7. }
  8.  
  9. if(($_SESSION['lastRefresh']+$this->timeout) < time())
  10. unset($_SESSION['userid']);
  11. $_SESSION['lastRefresh'] = time();
  12. ?>


  1. <?php
  2.  
  3. if($_SESSION['userid']){
  4. unset($_SESSION['userid']);
  5. error('Proszę o ponowne zalogowanie się!','index.php');
  6. }
  7. }
  8.  
  9. (isset($_SESSION['userid']))
  10. or error('Dostęp do panelu mają tylko zalogowani użytkownicy!','index.php'); // wyrzuca błąd i przekierowuje do index.php
  11.  
  12. if(($_SESSION['lastRefresh']+$this->timeout) < time())
  13. unset($_SESSION['userid']);
  14. $_SESSION['lastRefresh'] = time();
  15. ?>
xeo
Kilka postów niżej masz jak ja to zrobiłem TU
Kod który trzeba dodać to:
  1. <?php
  2. if (!isset($_SESSION['kontrola_sesji'])){
  3. $_SESSION['kontrola_sesji'] = true;
  4. $_SESSION['adres_ip'] = $_SERVER['REMOTE_ADDR'];
  5. }
  6. if($_SESSION['adres_ip'] !== $_SERVER['REMOTE_ADDR']){
  7. $info = "Błąd: Próba przejęcia sesji!";
  8. }
  9. ?>
macandy
Widziałem twój temat już wcześniej, ale wtedy nie do końca rozumiałem sens tych zabiegów. Później jednak natrafiłem na artykuł z wikibooks, na którym przypuszczam, że się wzorowałeś... Rozjaśnił mi on nieco sprawę i nie muszę już wklejać kodu "na wiarę" smile.gif

Dzięki za pomoc.

Dorzucam linka, może się komuś przyda:
http://pl.wikibooks.org/wiki/PHP/Sesje
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.