Vra

Wat is 'n paar riglyne vir die handhawing van verantwoordelike sessiesekuriteit met PHP?Daar is inligting oral op die web en dit is tyd dat dit alles op een plek beland!

Was dit nuttig?

Oplossing

Daar is 'n paar dinge om te doen om jou sessie veilig te hou:

  1. Gebruik SSL wanneer u gebruikers staaf of sensitiewe bewerkings uitvoer.
  2. Hergenereer die sessie-ID wanneer die sekuriteitsvlak verander (soos om aan te meld).U kan selfs die sessie-ID elke versoek herskep as u wil.
  3. Hou sessies tyd uit
  4. Moenie register globals gebruik nie
  5. Stoor stawingbesonderhede op die bediener.Dit wil sê, moenie besonderhede soos gebruikersnaam in die koekie stuur nie.
  6. Kyk die $_SERVER['HTTP_USER_AGENT'].Dit voeg 'n klein hindernis vir sessiekaping by.U kan ook die IP-adres nagaan.Maar dit veroorsaak probleme vir gebruikers wat die IP-adres verander as gevolg van lasbalansering op verskeie internetverbindings, ens. (wat die geval is in ons omgewing hier).
  7. Sluit toegang tot die sessies op die lêerstelsel af of gebruik pasgemaakte sessiehantering
  8. Vir sensitiewe bewerkings oorweeg dit om te vereis dat aangemelde gebruikers weer hul stawingbesonderhede verskaf

Ander wenke

Een riglyn is om te bel session_regenerate_id elke keer as 'n sessie se sekuriteitsvlak verander.Dit help om sessiekaping te voorkom.

My twee (of meer) sente:

  • Vertrou niemand
  • Filterinvoer, ontsnap uitset (koekie, sessiedata is ook jou invoer)
  • Vermy XSS (hou jou HTML goed gevorm, kyk na PHPTAL of HTML Purifier)
  • Verdediging in diepte
  • Moenie data blootstel nie

Daar is 'n klein maar goeie boek oor hierdie onderwerp: Essential PHP Security deur Chris Shiflett.

Noodsaaklike PHP-sekuriteit http://shiflett.org/images/essential-php-security-small.png

Op die tuisblad van die boek sal jy 'n paar interessante kodevoorbeelde en voorbeeldhoofstukke vind.

U kan tegniek gebruik wat hierbo genoem is (IP & UserAgent), wat hier beskryf word: Hoe om identiteitsdiefstal te vermy

Ek dink een van die groot probleme (wat in PHP 6 aangespreek word) is register_globals.Op die oomblik is een van die standaard metodes wat gebruik word om te vermy register_globals is om die te gebruik $_REQUEST, $_GET of $_POST skikkings.

Die "korrekte" manier om dit te doen (vanaf 5.2, hoewel dit 'n bietjie karig daar is, maar stabiel vanaf 6, wat binnekort kom) is deur filters.

Dus in plaas van:

$username = $_POST["username"];

jy sou doen:

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

of selfs net:

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

Hierdie sessie fiksasie vraestel het baie goeie aanwysings waar die aanval kan kom.Sien ook sessie fiksasie bladsy by Wikipedia.

Die gebruik van IP-adres is nie regtig die beste idee in my ervaring nie.Byvoorbeeld;my kantoor het twee IP-adresse wat gewoond raak na gelang van las en ons ondervind voortdurend probleme met die gebruik van IP-adresse.

In plaas daarvan het ek gekies om die sessies in 'n aparte databasis vir die domeine op my bedieners te stoor.Op hierdie manier het niemand op die lêerstelsel toegang tot daardie sessie-inligting nie.Dit was baie nuttig met phpBB voor 3.0 (hulle het dit sedertdien reggemaak), maar dit is steeds 'n goeie idee, dink ek.

Dit is redelik triviaal en voor die hand liggend, maar wees seker session_destroy na elke gebruik.Dit kan moeilik wees om te implementeer as die gebruiker nie eksplisiet afmeld nie, so 'n timer kan gestel word om dit te doen.

Hier is 'n goeie tutoriaal op setTimer() en clearTimer().

Die grootste probleem met PHP-sessies en sekuriteit (behalwe sessie-kaping) kom met die omgewing waarin jy is.By verstek stoor PHP die sessiedata in 'n lêer in die OS se temp-gids.Sonder enige spesiale nadenke of beplanning is dit 'n wêreld-leesbare gids sodat al jou sessie-inligting publiek is vir enigiemand met toegang tot die bediener.

Wat betref die instandhouding van sessies oor verskeie bedieners.Op daardie stadium sal dit beter wees om PHP oor te skakel na gebruiker hanteerde sessies waar dit jou verskafde funksies roep na CRUD (skep, lees, werk op, skrap) die sessiedata.Op daardie stadium kan jy die sessie-inligting in 'n databasis of memcache-agtige oplossing stoor sodat alle toepassingsbedieners toegang tot die data het.

Die stoor van jou eie sessies kan ook voordelig wees as jy op 'n gedeelde bediener is, want dit sal jou toelaat om dit in die databasis te stoor waaroor jy dikwels meer beheer het as die lêerstelsel.

Ek stel my sessies so op-

op die aanmeldbladsy:

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

(frase gedefinieer op 'n konfigurasiebladsy)

dan op die kopskrif wat regdeur die res van die webwerf is:

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

php.ini

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache voeg kopskrif by:

X-XSS-Protection    1

Ek sal beide IP en User Agent nagaan om te sien of hulle verander

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

As jy jy gebruik session_set_save_handler() jy kan jou eie sessie hanteerder stel.Byvoorbeeld, jy kan jou sessies in die databasis stoor.Verwys na die php.net kommentaar vir voorbeelde van 'n databasis sessie hanteerder.

DB-sessies is ook goed as jy veelvuldige bedieners het, anders as jy lêergebaseerde sessies gebruik, sal jy seker moet maak dat elke webbediener toegang tot dieselfde lêerstelsel het om die sessies te lees/skryf.

Jy moet seker wees dat die sessiedata veilig is.Deur na jou php.ini te kyk of phpinfo() te gebruik, kan jy jou sessie-instellings vind._session.save_path_ vertel jou waar hulle gestoor word.

Gaan die toestemming van die gids en van sy ouers na.Dit moet nie publiek (/tmp) wees of toeganklik wees vir ander webwerwe op jou gedeelde bediener nie.

As jy aanvaar dat jy steeds php-sessie wil gebruik, kan jy php stel om 'n ander gids te gebruik deur _session.save_path_ te verander of die data in die databasis te stoor deur _session.save_handler_ te verander.

Jy kan dalk _session.save_path_ in jou php.ini stel (sommige verskaffers laat dit toe) of vir apache + mod_php, in 'n .htaccess-lêer in jou werf se wortelgids:php_value session.save_path "/home/example.com/html/session".Jy kan dit ook tydens hardlooptyd instel met _session_save_path()_ .

Tjek Chris Shiflett se tutoriaal of Zend_Session_SaveHandler_DbTable te stel en alternatiewe sessie hanteerder.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top