Archief - PHP: Sessie voldoende beveiligen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

sarnath

Legacy Member
Ik ben momenteel al een tijdje bezig met php en heb nu grotendeels een site afgewerkt met de nodige functionaliteiten.

Nu zit ik echter bij de afwerking met het belangrijkste onderdeel "Beveiliging" nog wat in de knoei.

Ik maak dus een sessievariabele "user" aan waarin de nickname van een succesvol ingelogd persoon komt te staan.

Nuja als je een php omgeving hebt draaien thuis en je maakt een simpele php pagina aan waarin je bijvoorbeeld zet $_SESSION['user'] = "test" dan wordt er dus ook een user toegekend en is de site al "gehacked".

Nu vraag ik mij af wat ik hier eigenlijk het beste tegen kan doen, want zo kan ik het uiteraard niet laten.

Ik kwam al wat info tegen via google:
http://www.phphulp.nl/php/tutorials/10/38/91/

Ook vond ik tutorials op basis van IP adressen, maar aangezien dit niet bij iedereen werkt dmv dynamisch IP is dit al geen optie.

is zoiets aan te raden of zijn er efficiëntere methodes?

Alvast bedankt.

dJeez

Legacy Member
Voor wat je hierboven beschrijft is het al nodig dat de kraker erin slaagt van een script op je server te zetten en het van daaruit kan uitvoeren, remote werkt dat uiteraard niet. Als een hacker erin slaagt een script op je server te zetten dan denk ik trouwens dat je je andere zorgen moet maken dan het afschermen van die sessie vars :p.

Op die pagina waarnaar je verwijst spreken ze trouwens over session hijacking, daar proberen ze dus - via brute force of andere methode - een op dat moment actieve login van een andere gebruiker over te nemen door diens sessie ID te raden. Da's nog net iets anders...

BTW Neem zeker de informatie op http://phpsec.org/ eens door, daar kan je al wat ideeën opdoen en misschien nog 1 en ander uit bijleren...

killgore

Legacy Member
Je begrijpt het concept van sessies in PHP niet.

Bij een sessie creatie gebeurt hetvolgende:
PHP maakt een uniek id aan en slaat dit op bij de gebruiker (dmv cookies of het in een url te zetten). Beide methoden linken het dus al aan de site.

Dan, aan server side wordt de data opgeslagen, gelinkt aan dat ID. Bij een volgende bezoek stuurt een gebruiker dat id dan weer door en kan de server die data weer ophalen.

Waar zit eventuele onveiligheid? Een gebruiker die het sessionid van een andere gebruiker te weten komt. Daar zijn 2 manieren voor: ofwel leest hij het rechtstreeks uit de url of cookie van gebruiker als di ein zijn buurt zit, ofwel probeer je hte volgende session id te kraken (wat niet altijd even moeilijk is).

Oplossingen hiervoor zijn php sessies te koppelen aan data zoals ip-adres, browser information, zorgen dat de time out kort genoeg is, ... . Op djeez zijn link zullen wel conrete vbn staan :-).

Wat jij zegt (lokaal een sessie maken) doet er geen zak toe, want het session-id zal al anders zijn en gelinkt aan andere site (localhost) en de session inhoud staat dan op die lokale server :p.

Buiten hijacking zijn sessions vrij veilig hoor :-).

sarnath

Legacy Member
idd, dat script met die var had ik op mn lokale server gerunt, dacht dat het op mijn productieserver was, daarom dat het kraken dus lukte, dom van mij.

Nu, wat een sessie is en de algemene werking ken ik wel hoor, maar dacht gewoon dat het makkelijker te kraken was, op gebied van beveiliging heb ik nog totaal geen ervaring, maar ben net daarom veel met php bezig ;)

Alvast bedankt voor de reacties en nuttige info, site es bezien voor wat toe te passen taktieken :)

Bram

Legacy Member
Mss eens kijken naar CodeIgniter's sessie library? Die kan volledig database based zijn zodat $_SESSION[] er zelfs niet meer aan te pas komt... Zou blijkbaar nog veiliger moeten zijn...

sarnath

Legacy Member
is mss ook interessant, maar lijkt mij minder performant.
Zal de documentatie eens doornemen, bedankt alvast :)

killgore

Legacy Member
SveltestSword zei:
Mss eens kijken naar CodeIgniter's sessie library? Die kan volledig database based zijn zodat $_SESSION[] er zelfs niet meer aan te pas komt... Zou blijkbaar nog veiliger moeten zijn...

Linckxs zei:
is mss ook interessant, maar lijkt mij minder performant.
Zal de documentatie eens doornemen, bedankt alvast :)

Als dat goed gebouwd is is performantie hier echt van te verwaarlozen.

PHP session systeem heeft qua veiligheid lang onder kritiek gelegen. Het was vroeger bv. vrij eenvoudig om de volgende session-id's te raden. Ik weet niet of dat nu nog zo is, ik houd me minder en minder met PHP bezig.

Gogeta

Legacy Member
srry voor de hijack, maar is er een beperking qua aantal session variables?

WHiSPy

Legacy Member
Gogeta zei:
srry voor de hijack, maar is er een beperking qua aantal session variables?

Uiteraard. Er is immers ook 'n maximaal aantal geheugen de je kan alloceren voor variablen, hé. :)

taLa.

Legacy Member
Qua beveiliging van sessions zijn er in feite 2 delen die ge moet onderscheiden: de server-side en de client-side, waarbij de client-side veruit de belangrijkste is.

Aan de client-side wordt de session ID zoals al vermeld meegegeven via de URL of via een cookie. Een eerste checkpoint is al om ervoor te zorgen dat de session ID altijd via een cookie wordt meegegeven en nooit via een URL wegens veel te onveilig. Voor alle zekerheid kunt ge dat afdwingen met
PHP:
ini_set('session.use_trans_sid', 0);
ini_set('session.use_only_cookies', 1);

Ten tweede moet ge voorkomen dat de cookies van uw users gestolen worden. Het stelen van cookies gebeurt meestal via zogenaamde XSS exploits; dat komt erop neer dat iemand erin slaagt om een stukje Javascript (dat ze uiteraard zelf geschreven hebben) op uw site te laten uitvoeren. Aangezien ge via Javascript aan cookies kunt en de code vanop uw site wordt uitgevoerd, kan de cookie zo effectief gestolen worden, en dus ook de bijhorende session.

De boodschap is dus: XSS voorkomen, en dat is ook nog eens een categorie op zich. De vuistregel om XSS te voorkomen is ervoor te zorgen dat alle user input op uw site geëscaped wordt alvorens in de HTML te worden weergegeven. Met andere woorden, als ik als comment <script>alert('yu');</script> ingeef, mag dat niet als <script>alert('yu');</script> in de HTML komen te staan want dan hebt ge dus effectief een XSS-injection aan uw been. Om de user input te escapen voor HTML kunt ge gebruik maken van http://www.php.net/manual/en/function.htmlentities.php. Let er goed op dat je dit consequent toepast. Er zijn eigelijk zelden plaatsen waar ge dit niet moet toepassen, de voornaamste waarschijnlijk het weergeven van WYSIWYG-input (maar die input komt meestal toch van trusted users).

Sedert kort ondersteunen browsers trouwens ook cookies die gemarkeerd zijn als HTTP-only, maw. dat ze enkel nog via HTTP verstuurd worden en niet meer via Javascript kunnen gelezen worden. Als er dan toch XSS mogelijk is, dan kunnen ze in sommige gevallen toch nog de cookie niet lezen. Vanaf PHP 5.2.0 kun je dergelijke cookies aanvragen met
PHP:
ini_set('session.cookie_httponly', 1);

Dat zijn zowat de grootste gevaren waar ge voor moet uitkijken. Er zijn er nog een pak meer, maar dat wordt een beetje te lang om hier uit te leggen. Zoek zeker eens op Google naar onderwerpen als session hijacking, ik herinner mij ooit eens een PDF gelezen te hebben met een duidelijke uitleg van de verschillende soorten session-hijacking. Zo is het bijvoorbeeld belangrijk om telkens als er van userlevel gewisseld wordt (dus telkens als een user inlogt, naar de admin-panel gaat, etc) hem telkens opnieuw te authenticeren (ie. opnieuw laten inloggen). Lees ook zeker eens dit artikel (inclusief comments), ik dacht dat ik die PDF via dat artikel had gevonden. Het kan zeker ook geen kwaad om de andere artikels ook eens door te nemen, staat heel interessante informatie in.

Aan de kant van de server is er eigenlijk alleen maar een probleem als ge op een shared server werkt. Standaard komen PHP's sessions namelijk in /tmp terecht, en onder bepaalde omstandigheden is het dan mogelijk dat elke site op die server via PHP andermans session ids en soms zelfs data kan lezen. Toegegeven, 't is enigszins ver gezocht, maar het is zeker niet onmogelijk en er moet rekening mee gehouden worden waar nodig. Een alternatief is het session save path veranderen naar een directory die niet voor iedereen toegankelijk is (via session.save_path), of de sessions in een database opslaan (zie shiflett.org).

Om op uw vraag te antwoorden: de session data wordt opgeslaan in geserialiseerde vorm (of toch een lichte variant ervan) in gewone tekstbestanden. Die data moet dus elke keer ge-unserialized worden telkens er een ingelogde users een request maakt, en unserializen staat er niet bepaald om bekend snel te verlopen. Best dus geen al te grote hoeveelheden data in uw sessions opslaan, maar ge moet er nu ook weer geen schrik van hebben ze. Onder groot verstaan we arrays van 20.000 entries en dergelijke, geen 5 login variabelkes.

WHiSPy

Legacy Member
Gogeta zei:
en dan spreken we over ? 10? 20? 500?

Denk dat je m'n punt niet begrijpt, hé. Elke variable kan een variabel geheugen in beslag nemen afhankelijk van het type. Je session variable gaat dus enkel de pointer zijn naar dat geheugenadres.

Limitatie zijn de volgende parameters:

- Je hoeveelheid geheugen
- Je OS (op 'n 32-bit systeem kan je niet meer dan 4gb geheugen alloceren)
- Je virtual machine (php maakt daar geen gebruik van)
- PHP ondersteunt afaik geen 64-bit instructies

De eerste die hier met 'n concreet cijfer af komt zevert een serieus stukje uit z'n nek. En ik ga u ook niet vervelen met garbage collection-toestanden. (bv: unset gaan gebruiken op variablen in php) :)

killgore

Legacy Member
WHiSPy zei:
Denk dat je m'n punt niet begrijpt, hé. Elke variable kan een variabel geheugen in beslag nemen afhankelijk van het type. Je session variable gaat dus enkel de pointer zijn naar dat geheugenadres.

Limitatie zijn de volgende parameters:

- Je hoeveelheid geheugen
- Je OS (op 'n 32-bit systeem kan je niet meer dan 4gb geheugen alloceren)
- Je virtual machine (php maakt daar geen gebruik van)
- PHP ondersteunt afaik geen 64-bit instructies

De eerste die hier met 'n concreet cijfer af komt zevert een serieus stukje uit z'n nek. En ik ga u ook niet vervelen met garbage collection-toestanden. (bv: unset gaan gebruiken op variablen in php) :)

wow :wtf:

hoeveelheid geheugen heeft hier zelfs niets mee te maken, gezien sessies in het bestandssysteem worden opgeslagen, niet rechtstreeks in het ram (tenzij je natuurlijk een ramdisk gebruikt).
Een 2e beperkende factor is de maximum memory allocation per script (standaard 128 MiB), maar dat geldt dus voor gebruikte sessie-variabelen in dat script, niet de hele hoop. En als je meer dan 128 MiB aan sessievariabelen hebt ben je volgens mij ergens serieus verkeerd bezig :p.

Ik zou dus zeggen dat je met realistische sessies (doorgaans niet veel langer als enkele tientallen/honderden bytes) vrij onbeperkte capaciteit hebt.

Dus de opslag van sessions is afhankelijk van je bestandssysteem. Het gebruik is inderdaad wel afhankelijk van je gewoon geheugen.

Gogeta

Legacy Member
ah, ok, nja ik denk datk een 30-40tal variabele gan moete doorgeven dus da ga wel :)

sarnath

Legacy Member
nice, even niemeer gezweest, bedankt voor de deftige uitleg nog!

polleke

Legacy Member
Als ik een site met inlog systeem maak, werk ik altijd via sessions. Ik geef een user en passwoord mee, en bij het aanmelden/inloggen/... creëer ik altijd een userid, dit is random generated. dit user id, schrijf ik dan weg, en dan gewoon op de pagina een soort controle module maken die checkt of de usernaam overeen komt met het gecreëerde user id.

veronderstel wel dat dit redelijk veilig is, tot nu toe nog geen security breaches gehad.

sarnath

Legacy Member
polleke zei:
Als ik een site met inlog systeem maak, werk ik altijd via sessions. Ik geef een user en passwoord mee, en bij het aanmelden/inloggen/... creëer ik altijd een userid, dit is random generated. dit user id, schrijf ik dan weg, en dan gewoon op de pagina een soort controle module maken die checkt of de usernaam overeen komt met het gecreëerde user id.

veronderstel wel dat dit redelijk veilig is, tot nu toe nog geen security breaches gehad.

hoe ik het nu heb is dus zo:

je vult username en login in , gaat via POST naar form die verifieert met database, klopt dit dan wordt $_SESSION['user'] = "jenickname" geplaatst.

Als ik dan in een andere form zit, bijvoorbeeld nieuwspagina, en ik wil daar reageren, dan controleer ik gewoon "if isset($_SESSION['user']){ insert reactie in database }".

De ingegeven reactie wordt idd gefilterd met htmlentities, maar ik kan dus idd het best nog een extra controle doen met een id dan?

Hoe verifieer je die id dan? gewoon zoals ik mijn user aanmaak in session ook een id sessie variabele aanmaken en deze ook in een cookie schrijven en dan bij de nieuwsreactiepagina de id uit de cookie halen en deze vergelijken met de sessievariabele?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan