PHP Session Beveiliging

stemmen
125

Wat zijn de richtlijnen voor het handhaven van verantwoord veiligheid sessie met PHP? Er is informatie over het web en het is hoog tijd dat het allemaal geland op een plaats!

De vraag is gesteld op 02/08/2008 om 03:41
bron van user
In andere talen...                            


13 antwoorden

stemmen
15

Een richtlijn is om te bellen session_regenerate_id elke keer beveiligingsniveau verandert van een sessie. Dit helpt voorkomen dat het kapen van sessies.

antwoordde op 02/08/2008 om 03:43
bron van user

stemmen
11

Ik denk dat een van de grootste problemen (die wordt in PHP 6 is gericht) is register_globals. Op dit moment is een van de standaard methoden die worden gebruikt om te voorkomen register_globalsis om het te gebruiken $_REQUEST, $_GETof $_POSTarrays.

De "juiste" manier te doen (als 5,2, hoewel het een beetje buggy zijn, maar stabiel 6, die spoedig komt) is door middel van filters .

Dus in plaats van:

$username = $_POST["username"];

jij zou doen:

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

of zelfs alleen maar:

$username = filter_input(INPUT_POST, 'username');
antwoordde op 02/08/2008 om 03:55
bron van user

stemmen
3

Dit is vrij triviaal en voor de hand liggend, maar zorg ervoor dat session_destroy na elk gebruik. Dit kan moeilijk uit te voeren zijn als de gebruiker niet uit te expliciet in te loggen, zodat een timer kan worden ingesteld om dit te doen.

Hier is een goede handleiding op SetTimer () en clearTimer ().

antwoordde op 02/08/2008 om 04:16
bron van user

stemmen
3

Het grootste probleem met PHP sessies en veiligheid (naast het kapen van sessies) wordt geleverd met welke omgeving u zich bevindt. Standaard PHP slaat de sessie data in een bestand in het OS temp directory. Zonder enige speciale gedachte of van plan is dit een wereld leesbaar directory zodat al uw sessie-informatie is openbaar voor iedereen met toegang tot de server.

Voor wat betreft het handhaven van sessies over meerdere servers. Op dat moment zou het beter zijn om PHP de sessie data over te schakelen naar de gebruiker gehanteerd sessies waar het door u opgegeven functies oproepen naar CRUD (maken, lezen, bijwerken, verwijderen). Op dat moment kon je de sessie-informatie in een database of memcache als oplossing op te slaan, zodat alle applicatieservers toegang tot de gegevens.

Het opslaan van uw eigen sessies kan ook voordelig zijn als u op een gedeelde server, omdat het laat je het op te slaan in de database waarin je vaak meer controle over dan het bestandssysteem.

antwoordde op 03/08/2008 om 14:14
bron van user

stemmen
2

Ik zou zowel IP en User Agent controleren om te zien of ze veranderen

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
antwoordde op 04/08/2008 om 22:38
bron van user

stemmen
5

Het gebruik van IP-adres is niet echt het beste idee in mijn ervaring. Bijvoorbeeld; Mijn kantoor heeft twee IP-adressen die wennen afhankelijk van de belasting en we voortdurend problemen optreden met behulp van IP-adressen.

In plaats daarvan, heb ik gekozen voor het opslaan van de sessies in een aparte database voor de domeinen op mijn servers. Op deze manier niemand op het bestandssysteem toegang heeft tot die sessie info. Dit was echt behulpzaam met phpBB voordat 3,0 (ze hebben sinds deze vast), maar het is nog steeds een goed idee, denk ik.

antwoordde op 06/08/2008 om 21:44
bron van user

stemmen
2

Als je je gebruikt session_set_save_handler () kunt u uw eigen sessie handler in te stellen. U kunt bijvoorbeeld uw sessies op te slaan in de database. Raadpleeg de php.net commentaar voor voorbeelden van een database sessie handler.

DB sessies zijn ook goed als je meerdere servers anders zijn, indien u gebruik maakt van file-based sessies u zou moeten ervoor zorgen dat elke webserver toegang tot dezelfde bestandssysteem te lezen / schrijven sessies gehad.

antwoordde op 09/08/2008 om 04:28
bron van user

stemmen
88

Er zijn een paar dingen te doen om uw sessie te beveiligen:

  1. Gebruik SSL bij het verifiëren van gebruikers of het uitvoeren van gevoelige operaties.
  2. Regeneratie van de sessie-id wanneer de veiligheid niveau veranderingen (zoals logins). U kunt zelfs regenereren de sessie-id elk verzoek als je wilt.
  3. Hebben sessies time-out
  4. Gebruik geen registreren globals
  5. Store authenticatie gegevens op de server. Dat wil zeggen, geen gegevens door te sturen, zoals gebruikersnaam in de cookie.
  6. Controleer het $_SERVER['HTTP_USER_AGENT']. Dit voegt een kleine barrière voor het kapen van sessies. U kunt ook het IP-adres. Maar dit veroorzaakt problemen voor gebruikers die IP-adres toe te schrijven aan load balancing op meerdere internetverbindingen etc (wat het geval is in onze omgeving hier) hebben aan het veranderen.
  7. Vergrendelen toegang tot de sessies op de file systeem of het gebruik van aangepaste behandeling sessie
  8. Voor gevoelige operaties overwegen om van ingelogde gebruikers om hun authenication gegevens opnieuw te verstrekken
antwoordde op 11/08/2008 om 03:38
bron van user

stemmen
2

Je moet zorgen dat de sessie data veilig zijn. Door te kijken naar uw php.ini of met behulp van phpinfo () kunt u vinden sessie instellingen. _session.save_path_ vertelt u waar ze zijn opgeslagen.

Controleer de toestemming van de map en van zijn ouders. Het moet niet openbaar (/ tmp) of toegankelijk via andere websites op uw gedeelde server.

Ervan uitgaande dat je nog wilt php sessie te gebruiken, kunt u php ingesteld om een ​​andere map te gebruiken door het veranderen van _session.save_path_ of opslaan van de gegevens in de database door het veranderen van _session.save_handler_.

Je zou in staat zijn om _session.save_path_ ingesteld in php.ini (sommige providers toelaten) of voor apache + mod_php, in een .htaccess bestand in de hoofdmap van uw site: php_value session.save_path "/home/example.com/html/session". U kunt ook instellen op runtime met _session_save_path () _.

Controleer Chris Shiflett handleiding of Zend_Session_SaveHandler_DbTable te stellen en alternatieve sessie handler.

antwoordde op 18/08/2008 om 18:12
bron van user

stemmen
9

Deze sessie fixatie papier heeft een zeer goede aanwijzingen waar de aanval kan komen. Zie ook sessie fixatie-pagina op Wikipedia .

antwoordde op 05/03/2009 om 23:33
bron van user

stemmen
11

Mijn twee (of meer) centen:

  • Vertrouw niemand
  • Filter input, escape-uitgang (cookie, sessie gegevens uw input te)
  • Vermijd XSS (houd uw HTML goed gevormd, neem een kijkje op PHPTAL of HTMLPurifier )
  • Verdediging in de diepte
  • Laat gegevens niet bloot

Er is een kleine, maar goed boek over dit onderwerp: Essentiele PHP Beveiliging door Chris Shiflett .

Essentieel PHP Beveiliging http://shiflett.org/images/essential-php-security-small.png

Op de homepage van het boek vindt u een aantal interessante code voorbeelden en sample hoofdstukken.

U kunt hiervoor (IP & UserAgent) genoemde techniek, die hier beschreven te gebruiken: Hoe om identiteitsdiefstal te voorkomen

antwoordde op 06/04/2010 om 17:05
bron van user

stemmen
3

Ik zette mijn sessies op als dit-

op de inlogpagina:

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

(Frase gedefinieerd op een config pagina)

dan op de header die is in de rest van de site:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}
antwoordde op 19/07/2011 om 22:40
bron van user

stemmen
3

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache toe te voegen header:

X-XSS-Protection    1
antwoordde op 13/10/2011 om 03:40
bron van user

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