Aktuellt läge: PHP2Shell. Två kritiska PHP-sårbarheter (CVSS 9,2) tillåter skadlig kod utan inloggning. Patchar sedan den 21 oktober 2026.Vad som bör göras nu →

Sessioner och cookies i PHP

Sessioner gör det tillståndslösa HTTP till en inloggning som håller över flera sidor. Här står hur PHP löser det internt, vilka standardvärden som gäller och vad session.upload_progress har med PHP2Shell att göra.

Aktualitet 4 min läsningPHP-kunskap

Kort sagt: HTTP minns ingenting mellan två förfrågningar. En PHP-session löser det: PHP tilldelar ett slumpmässigt sessions-ID, skickar det som cookie till webbläsaren och lagrar tillhörande uppgifter på servern, som standard som fil. Vid varje ny förfrågan läser session_start() in uppgifterna på nytt utifrån ID:t. Till PHP-sessionen hör också funktionen session.upload_progress, som php.net på grund av PHP2Shell rekommenderar att tillfälligt stänga av på serversidan.

Varför webbapplikationer behöver sessioner

Varje förfrågan till en webbserver står för sig. Utan ett extra mekanism skulle en butik vid klicket på ”Varukorg” inte längre veta vem som nyss la något i den, och ett adminområde skulle fråga efter lösenordet vid varje klick. Sessioner förbinder enskilda förfrågningar till en session.

För beslutsfattare betyder det: Sessions-ID:t är efter inloggningen värt lika mycket som användarnamn och lösenord tillsammans. För administratörer betyder det: Var och hur sessionsdata ligger är en säkerhetsfråga, särskilt på servrar med flera webbplatser.

Vad som händer vid session_start()

Förloppet är detsamma vid varje förfrågan och kan beskrivas i fem steg:

  1. Webbläsaren skickar med cookien med sessionsnamnet, som standard PHPSESSID.
  2. session_start() läser ID:t och lämnar över det till lagringshanteraren, som standard files.
  3. Hanteraren laddar de lagrade uppgifterna, PHP omvandlar dem tillbaka med serialize_handler och fyller $_SESSION.
  4. Skriptet läser och ändrar $_SESSION som en vanlig array.
  5. I slutet av förfrågan skriver PHP tillbaka uppgifterna. Med session.lazy_write (standard: på) bara om de har ändrats.
<?php
session_start();

$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];

Finns ingen session ännu skapar PHP ett nytt ID och sätter cookien. Är session.use_strict_mode aktivt avvisar PHP okända ID:n som webbläsaren anger och skapar ett nytt. PHP-manualen betecknar den här inställningen som obligatorisk för grundläggande säkerhet.

Standardvärden som man bör känna till

Följande värden gäller enligt PHP-manualen när inget annat har konfigurerats. Många distributioner och webbhotell sätter egna värden, därför räknas alltid den faktiskt verksamma konfigurationen.

Inställning Standard Betydelse
session.save_handler files lagringsplats för uppgifterna, även Redis eller databas möjligt
session.name PHPSESSID cookiens namn
session.serialize_handler php format för de lagrade uppgifterna
session.use_strict_mode 0 okända ID:n godtas
session.use_only_cookies 1 inget sessions-ID i adressen
session.cookie_httponly 0 JavaScript kan läsa cookien
session.cookie_secure 0 cookien även över okrypterad HTTP
session.cookie_samesite tom inget SameSite-attribut
session.gc_maxlifetime 1440 sekunder till möjlig uppstädning
session.gc_probability / gc_divisor 1 / 100 uppstädning vid ungefär var hundrade start
session.upload_progress.enabled 1 uppladdningsförloppet skrivs till sessionen

Värdena för cookie_httponly, cookie_secure och use_strict_mode är alltså från fabrik inte utformade för säkerhet. Hur ni sätter dem rätt beskriver guiden Säkra sessioner i PHP. Inställningarna session.sid_length och session.sid_bits_per_character är sedan PHP 8.4.0 markerade som föråldrade.

Sätta cookies direkt

Vid sidan av sessionscookien kan en applikation sätta egna cookies. Sedan PHP 7.3.0 tar setcookie() för det en array med alternativ, inklusive samesite. Sedan PHP 8.5.0 finns dessutom alternativet partitioned.

<?php
setcookie('sprache', 'de', [
    'expires'  => time() + 60 * 60 * 24 * 30,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

Enligt manualen måste vid samesite lika med None också secure vara satt, annars blockerar webbläsaren cookien. Cookies är data från webbläsaren: Deras innehåll kommer vid nästa förfrågan tillbaka via $_COOKIE och måste kontrolleras som all annan inmatning. Mer om detta på sidan Superglobaler.

session.upload_progress: förloppsvisning för uppladdningar

PHP kan under en filuppladdning skriva förloppet till sessionen. För det skickar formuläret ett dolt fält med namnet från session.upload_progress.name, som standard PHP_SESSION_UPLOAD_PROGRESS. PHP lägger sedan uppgifterna under en nyckel med prefixet upload_progress_ i $_SESSION, med uppgifter som starttid, totalstorlek och redan bearbetade byte.

Viktigt för förståelsen: Enligt manualen skriver PHP den här informationen till sessionen innan något skript körs. Funktionen arbetar alltså under bearbetningen av förfrågan, före applikationskoden. Dess inställningar är av typen INI_PERDIR och går inte att ändra vid körning.

Sessioner och PHP2Shell: övergångsåtgärden

Som en av övergångsåtgärderna mot PHP2Shell-sårbarheterna nämner php.net att sätta session.upload_progress.enabled=0 i php.ini, i FPM-poolen eller i serverkonfigurationen och därefter starta om alla workers, uttryckligen inte via ini_set() eller .user.ini. Den 23 oktober 2026 tillkom meddelandet om CVE-2026-115560, med samma åtgärd fram till nästa reguljära bugfix-release.

; webbplatsens FPM-pool, starta därefter om alla workers
php_admin_flag[session.upload_progress.enabled] = off

Enligt fackrapporter täpper den här inställningen ensam inte till båda sårbarheterna. Uppdateringen till PHP 8.5.12, 8.4.27, 8.3.36 eller 8.2.35 förblir obligatorisk. Om er applikation över huvud taget använder uppladdningsförloppet och hur ni sätter inställningen varaktigt beskriver artikeln Stänga av session.upload_progress.

Hur hjälper PHP SOS konkret?

  • Vi läser ut de faktiskt verksamma sessionsinställningarna per webbplats, inte bara kommandoradens värden.
  • Vi sätter PHP2Shell-övergångsåtgärderna per pool, startar om alla workers och kontrollerar resultatet.
  • Vi skiljer sessionslagringsplatser och pool-användare åt mellan webbplatser inom ramen för serverhärdning.
  • Efter en incident förkastar vi alla befintliga sessioner, så att stulna sessions-ID:n blir värdelösa.

Vanliga frågor

Vad är skillnaden mellan cookie och session?

En cookie är en liten datapost som webbläsaren lagrar och skickar med vid varje förfrågan. En session lagrar de egentliga uppgifterna på servern; i cookien finns bara en slumpmässig identifierare, sessions-ID:t.

Hur länge lever en PHP-session?

Sessionscookien gäller som standard tills webbläsaren stängs. Uppgifterna på servern får städas bort efter session.gc_maxlifetime, som standard 1440 sekunder utan åtkomst. När det faktiskt sker beror på systemets uppstädningslogik.

Vad gör session.upload_progress?

Funktionen skriver under en filuppladdning förloppet till sessionen, så att en andra förfrågan kan visa det. Den är aktiv som standard. På grund av PHP2Shell rekommenderar php.net att tillfälligt stänga av den på serversidan.

Räcker det att stänga av session.upload_progress med ini_set()?

Nej. Inställningen går enligt manualen ändå inte att ändra vid körning, och php.net nämner uttryckligen php.ini, FPM-pool eller serverkonfiguration som rätt platser, inte ini_set() eller .user.ini. Starta därefter om alla workers.

Källor

Direktkontakt

Varje timme räknas. Skriv till oss nu.

Beskriv kort system, PHP-version och observation. Vi hör av oss, klarlägger läget och arbetar på distans tills incidenten är avslutad och dokumenterad.

Direkthjälp