Kort sagt: Under Windows opdaterer I PHP i hånden: hent den rettede version fra php.net, vælg den samme variant (Thread Safe eller Non Thread Safe) og arkitektur, kontrollér downloadet med SHA-256, overtag php.ini og udvidelser, omstil stien og genstart alle PHP-processer. Særligt presserende er opdateringen, hvis Apache under Windows indlæser PHP som modul, for denne driftsform vurderer PHP-teamet højest ved PHP2Shell.
Hvor PHP overalt sidder på Windows-computere
Windows-servere med PHP findes hyppigere, end mange tror. Sjældent er det det store website, ofte er det intranet, fagapplikationer eller værktøjer, som nogen satte op for år siden. Driften under IIS er udførligt beskrevet på siden Sikring af PHP under Windows og IIS. Dette indlæg behandler selve opdateringen og tilfældene ud over IIS.
Typiske fundsteder er Apache til Windows med PHP som modul, udviklerpakker som XAMPP, WampServer eller Laragon, der er havnet på en server, egne PHP-kopier i fagapplikationer og PHP-scripts i planlagte opgaver. Følgende PowerShell-kommandoer læser kun og hjælper med at finde dem:
# Find alle php.exe på drev C: (tager lidt tid på store drev)
Get-ChildItem -Path C:\ -Filter php.exe -Recurse -ErrorAction SilentlyContinue |
Select-Object FullName, LastWriteTime
# Hvilken php.exe ligger i søgestien?
where.exe php
# Kørende PHP- og Apache-processer med sti og starttidspunkt
Get-Process php*, httpd -ErrorAction SilentlyContinue | Select-Object Name, Id, StartTime, Path
# Version og indlæst konfiguration for en installation (stien er et eksempel)
& "C:\PHP\8.4\php.exe" -v
& "C:\PHP\8.4\php.exe" --ini
Vigtigt: Kører PHP som Apache-modul, findes der ingen egen PHP-proces. PHP sidder så i processen httpd.exe. Den, der kun leder efter php-cgi-processer, overser disse installationer.
Let at glemme er også planlagte opgaver, der kalder PHP-scripts, f.eks. til importer, rapporter eller dataafstemninger. De bruger ofte en egen, ældre php.exe. For PHP2Shell regnes de for mindre udsatte, fordi kommandolinjen ifølge php.net's hidtidige oplysninger ikke hører til de berørte driftsformer; ved udskiftningen skal de alligevel pege på den nye sti, ellers bliver den gamle installation ved med at være i brug og bliver aldrig fjernet.
# Planlagte opgaver, der kalder PHP
Get-ScheduledTask | Where-Object { $_.Actions.Execute -match 'php' } |
Select-Object TaskName, TaskPath, @{n='Programm';e={$_.Actions.Execute}}
Et eget emne er udviklercomputere. XAMPP og lignende pakker starter Apache med PHP som modul og kan ofte nås i hele virksomhedens netværk. Også dér skal PHP opdateres, og webserveren bør kun lytte på den egen computer.
Thread Safe eller Non Thread Safe: den rette variant
php.net tilbyder hver Windows-version i flere varianter. Til udskiftningen gælder: samme variant og arkitektur som hidtil, ellers indlæser webserver eller udvidelser ikke.
| Kendetegn | Muligheder | Hvornår hvilken |
|---|---|---|
| Trådsikkerhed | NTS (Non Thread Safe), TS (Thread Safe) | ifølge php.net NTS til FastCGI, f.eks. IIS, og kommandolinje; TS til PHP som modul i Apache |
| Arkitektur | x64, x86 | php.net anbefaler x64 |
| Compiler | VS16, VS17 | kræver Visual C++ Redistributable til Visual Studio 2015 til 2022 |
Til PHP 8.5 opførte php.net ved opslaget den 25.10.2026 versionen 8.5.12 fra 21.10.2026, som ZIP-arkiv i alle fire kombinationer. De øvrige understøttede grene vælger I på samme side. Rettet er 8.5.12, 8.4.27, 8.3.36 og 8.2.35. Til 8.1 og ældre findes der ikke længere officielle opdateringer.
PHP-opdatering under Windows: Kontrollér downloadet og udskift rent
- Hent den rettede version: fra Windows-downloadsiden på php.net, afpasset til variant og arkitektur.
- Sammenlign kontrolsum: php.net nævner en SHA-256-værdi til hvert arkiv. Afviger den, så brug ikke filen.
- Pak ud i en ny mappe: f.eks.
C:\PHP\8.4.27, så den gamle status bevares som tilbagevej. - Overtag konfigurationen: kopiér den hidtidige
php.ini, og sammenlign den med den nyephp.ini-production. - Kontrollér udvidelser: Yderligere DLL-filer fra tredjeparter skal passe til version, variant og arkitektur.
- Omstil stien: i FastCGI-indgangen, i
LoadModule-linjen i Apache eller i miljøvariablenPATH. - Genstart og kontrollér: Genstart webserverens tjeneste og planlagte opgaver, kontrollér derefter version og starttidspunkter.
# Beregn SHA-256 for den downloadede fil, og sammenlign med php.net
Get-FileHash .\php-8.5.12-nts-Win32-vs17-x64.zip -Algorithm SHA256
# Efter skiftet: indlæste udvidelser og version for den nye installation
& "C:\PHP\8.5.12\php.exe" -m
& "C:\PHP\8.5.12\php.exe" -v
Starter PHP ikke efter skiftet eller melder en manglende DLL, mangler ofte Visual C++ Redistributable i passende arkitektur, eller en udvidelse passer ikke til den nye version. Fejlen viser sig hurtigst, hvis I kalder php.exe -v direkte på kommandolinjen, før I omstiller webserveren. Hvad de enkelte poster i php.ini betyder, forklarer php.ini forklaret.
Apache under Windows: Tag modulbrug alvorligt
Mange ældre Windows-installationer binder PHP direkte ind i Apache via en LoadModule-linje. Det er teknisk det samme som mod_php under Linux. PHP-teamet vurderer risikoen ved PHP2Shell netop dér som højest, fordi der er vist en exploit, før applikationskode overhovedet kører. Baggrunden står under Hvorfor mod_php er særligt udsat.
Hvilke moduler en Apache indlæser, viser httpd.exe -M i installationens bin-mappe; kommandoen læser kun. Står der et PHP-modul, har opdateringen forrang. På mellemlang sigt er skiftet til PHP via FastCGI med NTS-build umagen værd, så PHP kører i egne processer. Det kræver en test, fordi konfiguration og rettigheder ændrer sig.
Udskiftningen af filerne lukker endnu ikke sårbarheden. Så længe Apache-tjenesten, IIS-applikationspools eller planlagte opgaver kører med den gamle version, forbliver sårbarheden åben. Kontrollér hver procens starttidspunkt efter opdateringen.
Efter opdateringen: Kontrol og spor
Notér pr. installation sti, version, variant og dato for skiftet. Fjern gamle PHP-mapper først, når den nye status kører stabilt, og så virkelig, så de ikke ved en fejl bindes ind igen.
En opdatering fjerner ikke malware. Kunne en Windows-server nås fra internettet i dagene før patchen, så kontrollér webmapper for nye scriptfiler, planlagte opgaver og lokale konti for ukendt indhold, og sikr webserverens logs fra og med den 20. oktober. Hvordan I genkender et indbrud, beskriver Er jeg allerede kompromitteret?.
Hvordan hjælper PHP SOS konkret?
- Find alle installationer: Vi leder efter PHP på jeres Windows-systemer, også i Apache-moduler, udviklerpakker og fagapplikationer.
- Udskift og dokumentér: Via PHP-patchservice skifter vi til den rettede version, kontrollerer kontrolsummer og dokumenterer version og procesopstart.
- Forbedr driftsformen: Hvor PHP kører som Apache-modul, planlægger og tester vi omstigningen til FastCGI.
- Kontrollér spor: Vi sikrer logs og undersøger systemerne for tegn på et angreb.
Ofte stillede spørgsmål
Opdaterer Windows Update også PHP?
Nej. PHP hører ikke til Windows. Det kommer som ZIP-arkiv fra php.net, som del af en pakke som XAMPP eller med en fagapplikation og skal opdateres ad denne vej.
Har jeg brug for Thread-Safe- eller Non-Thread-Safe-versionen?
Ifølge php.net er NTS beregnet til FastCGI, altså f.eks. til IIS, og til kommandolinjen. TS er beregnet til drift som modul i webserveren, f.eks. i Apache. Tag ved opdateringen den samme variant som hidtil.
Hvordan kontrollerer jeg, om PHP-downloadet er ægte?
php.net nævner en SHA-256-kontrolsum til hvert Windows-arkiv. Med Get-FileHash i PowerShell beregner I kontrolsummen for den downloadede fil og sammenligner begge værdier tegn for tegn.
Jeg bruger XAMPP på en server. Hvad nu?
Pakker som XAMPP medbringer deres eget PHP og Apache, ofte med PHP som Apache-modul. Kontrollér, om projektet tilbyder en version med rettet PHP, og omstil ellers installationen til en vedligeholdt løsning. Til produktiv drift er sådanne udviklerpakker under alle omstændigheder ikke tænkt.