PHP Session Security

stemmer
125

Hva er noen retningslinjer for å opprettholde ansvarlig session sikkerhet med PHP? Det er informasjon over hele nettet, og det er på tide det hele landet på ett sted!

Publisert på 02/08/2008 klokken 02:41
kilden bruker
På andre språk...                            


13 svar

stemmer
88

Det er et par ting du kan gjøre for å holde økten sikker:

  1. Bruk SSL når autentisering av brukere eller utføre sensitive operasjoner.
  2. Regenerere sesjons-ID'en når sikkerhetsnivået endres (for eksempel logger i). Du kan selv regenerere økten id hver forespørsel hvis du ønsker det.
  3. Har økter tid
  4. Ikke bruk registrer globals
  5. Oppbevares autentisering på serveren. Det vil si, ikke send detaljer som brukernavn i informasjonskapselen.
  6. Sjekk $_SERVER['HTTP_USER_AGENT']. Dette legger en liten barriere å øktkapring. Du kan også sjekke IP-adressen. Men dette skaper problemer for brukere som har skiftende IP-adresse på grunn av belastningsfordeling på flere internett-tilkoblinger etc (som er tilfelle i vårt miljø her).
  7. Låse tilgang til øktene på filsystemet eller bruke tilpassede session håndtering
  8. For sensitive operasjoner vurdere å kreve innloggede brukere til å gi sine autentiseringen detaljer igjen
Svarte 11/08/2008 kl. 02:38
kilden bruker

stemmer
15

En retningslinje er å ringe session_regenerate_id hver gang en økt sikkerhetsnivå endringer. Dette bidrar til å hindre øktkapring.

Svarte 02/08/2008 kl. 02:43
kilden bruker

stemmer
11

Mine to (eller flere) cents:

  • Ikke stol på noen
  • Filtrere input, escape utgang (cookie, sesjonsdata er dine innspill også)
  • Unngå XSS (holde HTML velformede, ta en titt på PHPTAL eller HTMLPurifier )
  • Forsvar i dybden
  • Utsett ikke data

Det er en liten, men god bok om dette emnet: Essential PHP Security ved Chris Shiflett .

Essential PHP Security http://shiflett.org/images/essential-php-security-small.png

På hjemmesiden til boka finner du noen interessante kode eksempler og sample kapitler.

Du kan bruke teknikken som er nevnt ovenfor (IP og brukeragent), som beskrives her: Hvordan unngå identitetstyveri

Svarte 06/04/2010 kl. 16:05
kilden bruker

stemmer
11

Jeg tror en av de store problemene (som blir behandlet i PHP 6) er register_globals. Akkurat nå en av de vanlige metodene som brukes for å unngå register_globalser å bruke $_REQUEST, $_GETeller $_POSTarrays.

"Riktig" måte å gjøre det (som på 5,2, selv om det er litt buggy der, men stabil fra og 6, som kommer snart) er gjennom filtre .

Så i stedet for:

$username = $_POST["username"];

du ville gjøre:

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

eller bare:

$username = filter_input(INPUT_POST, 'username');
Svarte 02/08/2008 kl. 02:55
kilden bruker

stemmer
9

Denne økten fiksering papiret har svært gode tips der angrepet kan komme. Se også session fiksering side på Wikipedia .

Svarte 05/03/2009 kl. 22:33
kilden bruker

stemmer
5

Ved hjelp av IP-adresse er egentlig ikke den beste ideen i min erfaring. For eksempel; kontoret mitt har to IP-adresser som blir brukt avhengig av belastning og vi stadig får problemer med å bruke IP-adresser.

I stedet har jeg valgt for lagring av øktene i en egen database for domener på mine servere. På denne måten ingen på filsystemet har tilgang til den økten info. Dette var veldig nyttig med phpBB før 3.0 (de har siden løst dette), men det er fortsatt en god idé synes jeg.

Svarte 06/08/2008 kl. 20:44
kilden bruker

stemmer
3

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

ekv Apache legge til topp:

X-XSS-Protection    1
Svarte 13/10/2011 kl. 02:40
kilden bruker

stemmer
3

Jeg satt mine økter opp som dette-

på innloggingssiden:

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

(Uttrykket er definert på en config side)

deretter på hodet som er hele resten av nettstedet:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}
Svarte 19/07/2011 kl. 21:40
kilden bruker

stemmer
3

Hovedproblemet med PHP sessions og sikkerhet (foruten øktkapring) kommer med det miljøet du er i. Som standard PHP lagrer sesjonsdata i en fil i OS er temp-katalogen. Uten noen spesiell tanke eller planlegger dette er en verden lesbar katalog så alt av økten informasjon er offentlig for alle med tilgang til serveren.

Som for å opprettholde økter over flere servere. På dette punktet ville det være bedre å bytte PHP til bruker håndtert økter der det kaller dine følger funksjoner for å crud (opprette, lese, oppdatere, slette) sesjonsdataene. På dette punktet kan du lagre økten informasjonen i en database eller memcache lignende løsning slik at alle applikasjonsservere har tilgang til dataene.

Lagring av dine egne økter kan også være en fordel om du er på en delt server fordi det lar deg lagre det i databasen som du ofte har mer kontroll over da filsystemet.

Svarte 03/08/2008 kl. 13:14
kilden bruker

stemmer
3

Dette er ganske trivielt og opplagt, men sørg for å session_destroy etter hver bruk. Dette kan være vanskelig å gjennomføre hvis brukeren ikke logger ut eksplisitt, så et tidsur kan stilles inn til å gjøre dette.

Her er en god tutorial på setTimer () og clearTimer ().

Svarte 02/08/2008 kl. 03:16
kilden bruker

stemmer
2

Du må være sikker på sesjonsdataene er trygge. Ved å se på php.ini eller bruke phpinfo () kan du finne deg session innstillinger. _session.save_path_ forteller deg hvor de er lagret.

Sjekk tillatelse fra mappen og dens foreldre. Det bør ikke være offentlig (/ tmp) eller være tilgjengelig for andre nettsteder på felles server.

Antar du fortsatt ønsker å bruke php sesjon, kan du sette php til å bruke en annen mappe ved å endre _session.save_path_ eller lagre data i databasen ved å endre _session.save_handler_.

Du kan være i stand til å sette _session.save_path_ i php.ini (noen leverandører tillater det) eller for apache + mod_php, i en .htaccess fil i nettstedets rot-mappe: php_value session.save_path "/home/example.com/html/session". Du kan også sette den under kjøring med _session_save_path () _.

Sjekk Chris Shiflett tutorial eller Zend_Session_SaveHandler_DbTable å sette og alternativ session behandleren.

Svarte 18/08/2008 kl. 17:12
kilden bruker

stemmer
2

Hvis du du bruker session_set_save_handler () du kan sette din egen sesjon handler. For eksempel kan du lagre dine økter i databasen. Referer til php.net kommentarer til eksempler på en database session behandleren.

DB økter er også bra hvis du har flere servere ellers Hvis du bruker File basert økter du vil trenge for å sørge for at hver webserver hadde tilgang til samme filsystem å lese / skrive øktene.

Svarte 09/08/2008 kl. 03:28
kilden bruker

stemmer
2

Jeg ville sjekke både IP og brukeragent for å se om de endrer

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
Svarte 04/08/2008 kl. 21:38
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more