PHP Sesiune de Securitate

Ce sunt unele linii directoare pentru menținerea responsabil sesiune de securitate cu PHP? Nu's informații de peste tot pe web și it's despre timp totul a aterizat într-un singur loc!

Soluția

Există o serie de lucruri pentru a face în scopul de a menține sesiunea securizat:

  1. Utilizarea SSL atunci când autentificarea utilizatorilor sau efectuarea de operațiuni sensibile.
  2. Regenera id-ul sesiunii ori de câte ori nivelul de securitate modificări (cum ar fi de logare). Puteți chiar să regenereze id-ul sesiunii fiecare cerere, dacă doriți.
  3. Au sesiuni de timp
  4. Don't folosi register globals
  5. Magazin detaliile de autentificare pe server. Asta este, nu't trimite detalii cum ar fi numele de utilizator în cookie.
  6. Verificați $_SERVER['HTTP_USER_AGENT']. Aceasta adaugă o mică barieră pentru deturnarea sesiunii. Puteți verifica, de asemenea, adresa IP. Dar acest lucru cauzează probleme pentru utilizatorii care au de a schimba adresa IP din cauza load balancing pe mai multe conexiuni la internet etc (care este cazul, în mediul nostru aici).
  7. Blocați accesul la sesiunile de pe sistemul de fișiere sau de a folosi personalizat sesiune de manipulare
  8. Pentru operațiunile sensibile ia în considerare necesită utilizatorii autentificați pentru a oferi lor authenication detalii din nou
Comentarii (12)

Un ghid este de a apela session_regenerate_id de fiecare dată când o sesiune's nivelul de securitate se schimbă. Aceasta ajută la prevenirea deturnarea sesiunii.

Comentarii (0)

Mele două (sau mai multe) de cenți:

  • Ai încredere în nimeni
  • Filtru de intrare, de evacuare de ieșire (cookie, datele de sesiune sunt dvs. de intrare prea)
  • Evita XSS (ține-ți HTML bine formate, să ia o privire la PHPTAL sau HTMLPurifier)
  • Apărare în profunzime
  • Nu expuneți datele

Există o mică, dar bună carte pe acest subiect: Esențiale PHP Securitate de Chris Shiflett.

Pe pagina de start a cărții veți găsi unele lucruri interesante exemple de cod și capitole de probă.

Puteți folosi tehnica menționat mai sus (IP & UserAgent), descris aici: Cum pentru a evita furtul de identitate

Comentarii (1)

Cred că una dintre problemele majore (care este abordată în PHP 6) este register_globals. Acum una dintre metodele standard folosite pentru a evita register_globals este de a folosi$_REQUEST,$_GETsau$_POST` tablouri.

"corect" cum să fac (ca de 5.2, deși l's un pic buggy, dar stabilă de 6, care este în curând) este prin filtre.

Deci, în loc de:

$username = $_POST["username"];

te-ar face:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

sau chiar doar:

$username = filter_input(INPUT_POST, 'username');
Comentarii (3)

Această sesiune repararea hârtie are foarte bune indicii în cazul în care atacul poate veni. A se vedea, de asemenea, sesiune de reparații de pagini de la Wikipedia.

Comentarii (0)

Folosind adresa IP este't într-adevăr cea mai bună idee din experienta mea. De exemplu; biroul meu are două adrese IP care sa folosit în funcție de sarcină și am rula în mod constant în probleme folosind adrese IP.

În schimb, am'am optat pentru stocarea sesiuni într-o bază de date separată pentru domeniile pe serverele mele. În acest fel nimeni de pe sistemul de fișiere are acces la informații sesiune. Acest lucru a fost foarte de ajutor cu phpBB înainte 3.0 (ei'am de fix asta), dar's încă o idee buna cred eu.

Comentarii (0)

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache adăugare antet:

X-XSS-Protection    1
Comentarii (3)

Acest lucru este destul de banal și evident, dar asigurați-vă că pentru a session_destroy după fiecare utilizare. Acest lucru poate fi dificil să pună în aplicare în cazul în care utilizatorul nu vă conecta în mod explicit, deci, un cronometru poate fi setat pentru a face acest lucru.

Aici este un bun tutorial pe setTimer() și clearTimer().

Comentarii (0)

Principala problemă cu sesiuni PHP și securitate (în afară de deturnarea sesiunii) vine cu ce mediul în care te afli. În mod implicit PHP stochează datele de sesiune într-un fișier în sistemul de OPERARE's temp directory. Fără nici un gând special sau de planificare aceasta este o lume de citit director astfel încât toate informațiile de sesiune este public pentru oricine cu acces la server.

Pentru menținerea sesiuni pe mai multe servere. În acel moment ar fi mai bine pentru a comuta PHP pentru utilizator manipulate sesiuni în cazul în care se solicită prevăzute funcții de CRUD (create, read, update, delete) sesiunea de date. În acel moment ai putea stoca sesiunea de informații într-o bază de date sau memcache ca soluție, astfel încât toate serverele de aplicații au acces la date.

Stocarea propriile sesiuni pot fi, de asemenea, avantajoasă dacă sunteți pe un server partajat, deoarece aceasta vă va permite să stocați în baza de date care de multe ori au mai mult control asupra atunci sistemul de fișiere.

Comentarii (0)

Mi-am setat sesiuni de așa-

pe pagina de autentificare:

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

(expresie definită pe o pagina de configurare)

apoi pe antet care este de-a lungul restul site-ului:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}
Comentarii (0)

Dacă utilizați session_set_save_handler(), puteți seta propriul dvs. sesiune handler. De exemplu, ai putea stoca sesiunile în baza de date. Se referă la php.net comentarii pentru exemple de o bază de date sesiune handler.

DB sesiuni sunt, de asemenea, bine, dacă aveți mai multe servere în caz contrar, dacă sunteți folosind sesiuni bazate pe fișiere tu ar trebui să asigurați-vă că fiecare server de web avut acces la același sistem de fișiere pentru a citi/scrie sesiuni.

Comentarii (0)

Mi-ar verifica IP și Agent Utilizator pentru a vedea daca se schimba

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
Comentarii (6)

Aveți nevoie pentru a fi sigur că datele de sesiune sunt în siguranță. Uitandu-te la php.ini sau folosind phpinfo() puteți găsi setările sesiunii. _session.savepath vă spune în cazul în care acestea sunt salvate.

Verifica permisiunea folderului și de părinții săi. Nu ar trebui't fi publice (/tmp) sau să fie accesibile prin alte site-uri de pe server partajat.

Presupunând totuși doriți să utilizați php sesiune, puteți seta php pentru a utiliza un alt dosar, prin schimbarea _session.savepath sau a salva datele in baza de date prin schimbarea _session.savehandler .

Ați putea fi capabil de a stabili _session.savepath în php.ini (unii furnizori permit) sau pentru apache + mod_php, într-o .htaccess în directorul rădăcină:

php_value sesiune.save_path "/home/exemplu.com/html/sesiune de". Puteți seta, de asemenea, o la timp a alerga cu _session_save_path()_ .

Verifica Chris Shiflett's tutorial sau Zend_Session_SaveHandler_DbTable pentru a seta și alternative sesiune handler.

Comentarii (0)