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!
Există o serie de lucruri pentru a face în scopul de a menține sesiunea securizat:
$_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).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.
Mele două (sau mai multe) de cenți:
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
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');
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.
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.
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().
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.
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();
}
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.
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ă:
Verifica Chris Shiflett's tutorial sau Zend_Session_SaveHandler_DbTable pentru a seta și alternative sesiune handler.