# Zabezpieczenie PHP w Windows i IIS

> Aktualizacja PHP w IIS po PHP2Shell: znajdź instalacje w Windows, wymień folder PHP, zrecykluj pule aplikacji i ustaw wartości przejściowe. Instrukcja krok po kroku.

Źródło: https://phpsos.de/pl/server/windows-iis-php/  
Stan: 25.10.2026  
Dostawca: PHP SOS, Pomoc awaryjna PHP i bezpieczeństwo serwerów. Natychmiastowa pomoc przez WhatsApp: https://wa.me/491736494914?text=Dzie%C5%84%20dobry%2C%20PHP%20SOS%2C%20potrzebujemy%20pomocy%20z%20naszym%20serwerem%20PHP.%20Firma%3A%20%E2%80%A6%20Strona%20internetowa%3A%20%E2%80%A6

**Krótko:** W Windows z IIS PHP działa zwykle jako `php-cgi.exe` przez FastCGI, czyli w trybie pracy wprost dotkniętym przez PHP2Shell. Aktualizacja PHP w IIS składa się z trzech kroków: znaleźć wszystkie instalacje PHP, zastąpić je wersją z usuniętą luką i zrecyklować pule aplikacji. Menedżera pakietów i backportów jak w Linuksie tu zazwyczaj nie ma.

## Jak PHP działa w IIS

Na serwerach Windows IIS łączy PHP przez moduł FastCGI. Dla każdej wersji PHP istnieje wpis FastCGI wskazujący na `php-cgi.exe` oraz przypisanie handlera, które kieruje tam pliki z rozszerzeniem `.php`. IIS w razie potrzeby uruchamia kilka procesów php-cgi i utrzymuje je aktywne dla kolejnych żądań.

Inaczej niż w Linuksie PHP zwykle nie pochodzi tu z menedżera pakietów, lecz z archiwum ZIP z kompilacjami Windows projektu PHP, jako część aplikacji branżowej albo ze starszych instalatorów. Oznacza to: aktualizacje nie przebiegają automatycznie i nie ma backportów dystrybutora. Rozstrzyga numer wersji zainstalowanych plików.

## Co PHP2Shell oznacza dla serwerów Windows

PHP2Shell obejmuje CVE-2026-109618 i CVE-2026-109619 w samym PHP, każdą z oceną CVSS v4.0 9.2. Obie umożliwiają wykonanie kodu bez logowania. Projekt PHP wprost wymienia php-cgi wśród dotkniętych trybów pracy. Usunięte są PHP 8.5.12, 8.4.27, 8.3.36 i 8.2.35.

Dla PHP 8.1 i starszych nie ma już oficjalnych aktualizacji. Serwery Windows z aplikacjami branżowymi działają z doświadczenia często na takich wersjach, ponieważ aplikacja wymaga określonej wersji. Tu oprócz środków przejściowych potrzebne jest uzgodnienie z producentem aplikacji. Tło dotyczące tego trybu pracy podaje artykuł [php-cgi: stare obciążenie z ryzykiem](https://phpsos.de/pl/server/php-cgi/).

## Aktualizacja PHP w IIS: znalezienie instalacji

Poniższe polecenia PowerShell tylko odczytują. Pokazują, jakich instalacji PHP używa IIS i jaką mają wersję. Ścieżki to przykłady.

```powershell
# Wpisy FastCGI w IIS: jakiego php-cgi.exe się używa?
& "$env:windir\system32\inetsrv\appcmd.exe" list config -section:system.webServer/fastCgi

# Wersja każdej znalezionej instalacji (ścieżka jako przykład)
& "C:\PHP\8.3\php.exe" -v

# Działające procesy php-cgi z czasem startu
Get-Process php-cgi -ErrorAction SilentlyContinue | Select-Object Id, StartTime, Path
```

Proszę dodatkowo przeszukać wszystkie dyski w poszukiwaniu innych `php-cgi.exe`, bo aplikacje branżowe czasem przynoszą własne kopie. Dla każdej instalacji proszę zanotować wersję, wariant (Thread Safe lub Non Thread Safe) i architekturę.

## Instalacja aktualizacji i recykling pul aplikacji

Proszę pobrać wersję z usuniętą luką z oficjalnych kompilacji Windows projektu PHP, linkowanych z php.net, w tym samym wariancie i tej samej architekturze. Sprawdziło się rozpakowanie nowej wersji do nowego folderu, przejęcie istniejącego php.ini i potrzebnych rozszerzeń, a następnie przełączenie wpisu FastCGI na nową ścieżkę. W ten sposób stary stan zostaje na wypadek powrotu.

```powershell
# Recykling puli aplikacji (nazwa jako przykład)
Import-Module WebAdministration
Restart-WebAppPool -Name "Intranet"

# Alternatywnie zrestartować wszystkie usługi IIS
iisreset

# Kontrola: czy wszystkie procesy php-cgi wystartowały po aktualizacji?
Get-Process php-cgi -ErrorAction SilentlyContinue | Select-Object Id, StartTime, Path
```

Każdy proces php-cgi musi mieć czas startu późniejszy niż aktualizacja i wskazywać na nową ścieżkę. Potem proszę przetestować strony. Stary folder PHP proszę usunąć, gdy nowy stan będzie działał stabilnie, aby nie został przypadkowo ponownie włączony.

> **Ważne:**
> Nowe pliki w folderze PHP nie wystarczą, dopóki działają stare procesy php-cgi. Dopiero po recyklingu pul lub restarcie IIS poprawka działa.

## Środki przejściowe w php.ini

Jeśli instalacji nie można zaktualizować od razu, php.net zaleca środki przejściowe bez pełnej ochrony. W IIS wartości ustawia się w centralnym php.ini danej instalacji. Pliki `.user.ini` i `ini_set()` według php.net nie wystarczają.

```ini
; php.ini dotkniętej instalacji
session.upload_progress.enabled = 0
post_max_size = 8M
upload_max_filesize = 6M
```

Przy funkcji uploadu php.net podaje `post_max_size = 32M`. W PHP 8.5 dochodzi `fatal_error_backtraces=0`. Aby strony nie zmieniały wartości przez własne pliki `.user.ini`, można w centralnym php.ini ustawić `user_ini.filename` na pusty; proszę wcześniej sprawdzić, czy aplikacje na tym nie polegają. Potem zrecyklować pule. BSI (niemiecki Federalny Urząd ds. Bezpieczeństwa w Technice Informatycznej) zaleca czasowe odłączenie serwerów WWW od sieci, jeśli aktualizacja nie jest możliwa od razu. Dalsze ustawienia wyjaśnia artykuł [Bezpieczna konfiguracja php.ini](https://phpsos.de/pl/ratgeber/php-ini-sicher-konfigurieren/).

## Po aktualizacji

Poprawka nie usuwa szkodliwego oprogramowania wprowadzonego wcześniej. Proszę zachować logi IIS od 20.10.2026, sprawdzić katalogi WWW pod kątem nowych plików skryptów oraz skontrolować zadania harmonogramu i lokalne konta użytkowników pod kątem nieznanych. Jeśli serwer działa w domenie, należy też spojrzeć na logowania.

Proszę zwrócić uwagę także na uprawnienia tożsamości pul aplikacji. Jeśli pula działa z kontem, które ma prawa zapisu do całego katalogu WWW albo nawet uprawnienia administracyjne, atakujący po udanym włamaniu może zdziałać znacznie więcej. Sensowna jest osobna, ograniczona tożsamość dla każdej puli z prawami zapisu tylko tam, gdzie aplikacja naprawdę ich potrzebuje, na przykład w folderze uploadu lub cache. W tych folderach IIS nie powinien wykonywać plików PHP; można to uregulować przez przypisania handlerów danego folderu. Proszę sprawdzić także, czy w katalogu WWW nie leżą stare pliki testowe i instalacyjne, takie jak wyniki phpinfo, i je usunąć.

## Jak konkretnie pomaga PHP SOS?

- Znajdujemy wszystkie instalacje PHP na Państwa serwerach Windows, także kopie w aplikacjach branżowych.
- Przez [usługę aktualizacji PHP](https://phpsos.de/pl/leistungen/php-patch-service/) wymieniamy PHP, recyklujemy pule i dokumentujemy wersję oraz czasy procesów.
- Przy starych wersjach ustalamy z Państwem i producentem aplikacji drogę do [migracji na obsługiwaną wersję PHP](https://phpsos.de/pl/leistungen/php-migration-legacy/).
- Sprawdzamy serwery pod kątem śladów ataku i zabezpieczamy logi.


## Częste pytania

**Jakiego wariantu PHP potrzebuję dla IIS?**  
Dla IIS z FastCGI zwykle używa się wariantu Non-Thread-Safe (NTS). Przy aktualizacji proszę zadbać o wybór tego samego wariantu i tej samej architektury, aby rozszerzenia nadal pasowały.

**Czy wystarczy rozpakować nowy folder PHP?**  
Nie. IIS utrzymuje procesy php-cgi.exe aktywne przez pewien czas. Proszę zrecyklować pule aplikacji lub zrestartować IIS i sprawdzić, że żadne stare procesy już nie działają.

**Czy mogę prowadzić kilka wersji PHP na jednym IIS?**  
Tak, przez kilka wpisów FastCGI i przypisań handlerów dla każdej strony. Zwiększa to jednak nakład pracy utrzymaniowej. Każda instalacja wymaga własnej aktualizacji i własnej kontroli.

**Czy PHP w Windows jest dotknięte przez PHP2Shell?**  
Luki leżą w samym PHP. W IIS PHP działa zwykle jako php-cgi, które projekt PHP wprost zalicza do dotkniętych trybów pracy. Serwery Windows proszę więc traktować równie pilnie jak serwery Linux.

## Źródła

- [php.net: komunikaty bezpieczeństwa](https://www.php.net/)
- [PHP 8 ChangeLog](https://www.php.net/ChangeLog-8.php)
- [php.net: obsługiwane wersje](https://www.php.net/supported-versions.php)
- [BSI](https://www.bsi.bund.de/)
