Sessioner och säkerhet i PHP

2016-04-23 21:26:44

Att installera servermjukvara, såsom ett CMS eller en webbshop är i sig inte svårt, men det kan vara skäl att verifiera säkerheten med ett proffs ifall du lagrar känslig information om dina användare. Avsikten med detta inlägg är att belysa riskerna med sessioner, och varför det är viktigt att ha koll på hur din webbapplikation hanterar sessioner.

Kort om vad en session är

Webbsidor med inloggning använder sessioner för att hålla reda på vem du är efter inloggning. När du loggar in skapas en fil på servern med ett unikt namn (session id). En cookie sätts i din webbläsare, vars uppgift är att hålla reda på vilken din sessions-id är.

I webbläsarens dev-toolbar kan du se dina cookies:

session

 Sessionens lagringsplats

För en server med en normal PHP-installation, konfigureras sessionshanteringen i php.ini filen men kan överskridas med .htaccess:

php_value session.save_path '/sokväg/till/katalog/'

och via skript med:

ini_set('session.save_path', '/sökvag/till/katalog/');

För många opensource-plattformar definieras sessionernas lagringsplats i applikationen d.v.s. i en konfigurationsfil. Detta upplägg är vanligt, det är ett bekvämt alternativ för att applikationen lätt skall kunna host:as hos ett webbhotell där man vill hålla webbsidornas sessioner separerade och blir tvungna att frångå standard upplägget. De flesta PHP-baserade applikationerna idag är enkla att installera; placera kodbasen på en server, konfigurera databaskopplingen och du är up n' running.

Vad som händer när applikationen själv bestämmer lagringsplats för sessionerna, är att sessionerna ofta blir lagrade någonstans i WWW-katalogen. Applikationen (vanligen Apache-användaren www-data) måste ha läs- & skriv-rättigheter till katalogen, vilket gör att denna katalog också är tillgänglig publikt på nätet (!).

index of

 Session hijacking

Förutom att sessionen kan innehålla känslig information, så kan man med denna information logga in utan lösenord med alla dessa sessioner när man känner till dess identifierare. Det enda man behöver göra är att justera sin egen sessions cookie.

Att sätta en ny session är enkelt, t.ex. med Google Chrome plugin:en Edit this Cookie eller så kan man göra det med JavaScript direkt i developer konsollen på följande vis:

document.cookie = "COOKIE_NYCKEL:COOKIE_VÄRDE";

console session

Åtgärder

1.) Definiera ingen specifik session.save_path om du absolut inte måste. Kommentera ut denna regel om du hittar en sådan i koden, så kommer en default sökväg att tillämpas, dessutom kan du då försäkra dig om att PHP:s garbage collector lyckas rensa bort gamla sessioner. 

2.) Om du definierar en sökväg, låt aldrig PHP lagra sina sessioner i din WWW-katalog, ange en sökväg utanför den. Då kan du ge applikationen läs- & skriv-rättigheter till katalogen, utan att den blir tillgänglig utifrån över HTTP-protokollet.