Sitwazzjoni attwali: PHP2Shell. Żewġ vulnerabbiltajiet kritiċi ta' PHP (CVSS 9,2) jippermettu kodiċi malizzjuż mingħajr login. Patches mill-21/10/2026.X'għandu jsir issa →

Ikkonfigura Nginx għal PHP b'mod sigur

Il-biċċa l-kbira tad-dgħufijiet f'setups ta' Nginx għal PHP ma jinsabux f'Nginx, imma f'ftit linji tal-PHP-location. Hekk tikkonfigura t-trasferiment lil PHP-FPM b'mod li jiġu eżegwiti biss skripts mixtieqa.

Stat 6 min. qariTisħiħ u konfigurazzjoni

Fil-qosor: Biex tikkonfigura Nginx għal PHP b'mod sigur, agħti lil PHP-FPM biss skripts li verament jeżistu, f'applikazzjonijiet b'front controller anke biss l-index.php. Magħhom jgħoddu dotfiles imblukkati bħal .git u .env, server standard għal ismijiet ta' host mhux magħrufa, limiti tad-daqs adattati u security.limit_extensions = .php fil-pool. Dan ma jipproteġix minn vulnerabbiltajiet f'PHP innifsu, imma jillimita dak li jista' jiġi eżegwit wara żball.

L-aktar linji perikolużi jinsabu fil-PHP-location

Minn PHP2Shell ħafna timijiet jivverifikaw il-verżjonijiet u l-pools tal-PHP-FPM tagħhom, kif tiddeskrivi l-paġna Issaħħaħ Nginx ma' PHP-FPM, u wara l-aġġornament jerġgħu jibdew il-workers kollha. It-tieni ħarsa tmur lejn il-konfigurazzjoni ta' Nginx innifsha. Hemmhekk jiġi deċiż liema fajls jiġu eżegwiti fil-fatt bħala PHP.

F'ħafna konfigurazzjonijiet hemm blokk li jgħaddi kull talba għal .php lil PHP-FPM, ikun fejn ikun il-fajl. Jekk fajl PHP introdott jispiċċa f'folder tal-upload, is-server jesegwih. Minn żball tal-fajls issir hekk backdoor.

Dan l-artikolu jikkonċentra fuq in-naħa ta' Nginx: liema direttivi jgħoddu, kif taħdem l-ordni tal-blokki location u kif tittestja r-riżultat.

Kif Nginx jiddeċiedi liema blokk japplika

Min irid jikkonfigura Nginx għal PHP b'mod sigur irid jaf kif jintgħażlu l-blokki location. Skont id-dokumentazzjoni ta' Nginx, dan jimxi hekk:

  1. Taqbila eżatta b'location = itemm it-tiftix minnufih.
  2. Fost il-prefix-locations tinżamm l-itwal waħda li taqbel. Jekk għandha ^~, ma jiġu vverifikati aktar espressjonijiet regolari.
  3. Inkella l-espressjonijiet regolari (~, ~*) jiġu vverifikati fl-ordni tal-fajl tal-konfigurazzjoni; l-ewwel taqbila tirbaħ.
  4. Jekk l-ebda espressjoni regolari ma taqbel, tgħodd il-prefix-location mżomma.

Minn hawn jinqalgħu żewġ regoli prattiċi. Blokk għal PHP f'folders tal-upload jrid jinħoloq jew bħala prefiss ^~ jew bħala espressjoni regolari qabel il-blokk ġenerali ta' PHP. U prefix-location normali bħal location /uploads/ ma tipproteġix, għax l-espressjoni regolari għal .php tegħlebha.

Konfigurazzjoni bażika sigura

L-eżempju li ġej juri blokk server għal applikazzjoni b'front controller, kif komuni ma' Laravel, Symfony, Shopware 6 jew ħafna żviluppi proprji. Mogħdijiet, socket u ċertifikati tadattahom int.

server {
    listen 443 ssl;
    server_name www.example.de;
    root /var/www/seite1/public;
    index index.php;

    ssl_certificate     /etc/ssl/seite1/fullchain.pem;
    ssl_certificate_key /etc/ssl/seite1/privkey.pem;

    server_tokens off;
    client_max_body_size 32m;

    # Ippermetti Let's Encrypt u mogħdijiet magħrufa oħra
    location ^~ /.well-known/ {
        try_files $uri =404;
    }

    # Ibblokka fajls u folders moħbija (.git, .env, .htaccess)
    location ~ /\. {
        deny all;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # Biss il-front controller jinbgħat lil PHP-FPM
    location = /index.php {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_hide_header X-Powered-By;
        fastcgi_pass unix:/run/php/seite1.sock;
    }

    # Kull fajl PHP ieħor ma jiġix eżegwit
    location ~ \.php$ {
        return 404;
    }
}

$realpath_root isolvi links simboliċi. Dan huwa importanti f'deployments b'symlink li jinbidel lejn ir-release attwali, biex PHP-FPM u OPcache jaraw il-mogħdija t-tajba. Innota wkoll: skont id-dokumentazzjoni ta' Nginx, direttivi fastcgi_param jintirtu minn livelli ogħla biss jekk fil-livell attwali ma jkun hemm l-ebda proprji. Għalhekk include fastcgi_params; jappartjeni fl-istess blokk.

CMS klassiċi bħal WordPress, TYPO3 jew Contao għandhom diversi punti tad-dħul. Hemmhekk issostitwixxi l-blokk tal-front controller b'PHP-location ġenerali li tgħaddi biss fajls li jeżistu (try_files $uri =404;), u ibblokka l-eżekuzzjoni f'kull folder li jista' jinkiteb. Kif dan jirnexxi jinsab taħt Ipprojbixxi l-eżekuzzjoni ta' PHP f'folders tal-upload.

It-tieni protezzjoni f'PHP-FPM

Nginx jiddeċiedi x'jinbagħat 'il quddiem, PHP-FPM jiddeċiedi x'jesegwixxi. Skont il-manwal ta' PHP, PHP-FPM b'mod standard jesegwixxi fajls .php u .phar u hu stess jirrakkomanda li dan jiġi llimitat għal .php. Dan jaqbad żbalji ta' konfigurazzjoni fis-server tal-web.

; fil-pool, pereżempju /etc/php/8.3/fpm/pool.d/seite1.conf
security.limit_extensions = .php
listen = /run/php/seite1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Is-socket għandu jkun aċċessibbli biss għal Nginx. Ports FPM fin-netwerk, bħal 9000, m'għandhomx jinfetħu lejn barra. Kif is-server ġeneralment juri biss il-ports meħtieġa tiddeskrivih Firewall għal servers tal-web: iftaħ biss il-ports meħtieġa.

Ismijiet ta' host mhux magħrufa u vit oħra

Mingħajr server standard proprju, Nginx iwieġeb għal talbiet għal ismijiet ta' host mhux magħrufa bl-ewwel blokk server li jaqbel. Skans awtomatiċi li jindirizzaw biss l-indirizz IP imbagħad jispiċċaw direttament fl-applikazzjoni tiegħek. Server standard proprju jtemm talbiet bħal dawn mingħajr tweġiba.

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_reject_handshake on;
    return 444;
}

Punti oħra li ppruvaw ruħhom:

Vit Rakkomandazzjoni Skop
server_tokens off l-ebda numru ta' verżjoni fl-headers u paġni ta' żball
client_max_body_size adattat għal post_max_size irrifjuta talbiet kbar kmieni
autoindex mitfi (standard) l-ebda listi ta' direttorji
fastcgi_hide_header X-Powered-By l-ebda verżjoni ta' PHP lejn barra
Paġni tal-istatus pm.status_path biss internament l-ebda data operattiva pubblika
Fajls ta' backup ibblokka jew neħħi .sql, .zip, .bak fil-webroot l-ebda download ta' databases

Aktar dwar l-indikazzjonijiet tal-verżjoni jinsab fl-artikolu expose_php u Server-headers.

Vit ieħor jolqot il-metodi HTTP permessi. Il-biċċa l-kbira tal-websajts jeħtieġu biss GET, HEAD u POST. B'limit_except metodi oħra jistgħu jiġu rrifjutati f'location; skont id-dokumentazzjoni ta' Nginx, l-għoti ta' GET awtomatikament jippermetti wkoll HEAD. Ivverifika qabel jekk interfaces tal-applikazzjoni tiegħek jużawx PUT jew DELETE, għax REST-APIs spiss jagħmlu hekk.

Ittestja qabel ma tagħmel reload

Kull bidla tivverifikaha l-ewwel b'nginx -t u biss imbagħad terġa' tgħabbi Nginx. Wara ittestja l-imġiba minn barra b'talbiet normali lid-dominju tiegħek stess:

sudo nginx -t && sudo systemctl reload nginx
# Mistenni: 403 jew 404
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.git/HEAD
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.env
# Mistenni: 404, għax jiġi eżegwit biss il-front controller
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/info.php
# Liema blokki jgħaddu lil PHP-FPM?
sudo nginx -T 2>/dev/null | grep -nE "location|fastcgi_pass"

Qabel kull bidla akbar salva l-output sħiħ ta' nginx -T bid-data. Fiha l-konfigurazzjoni effettiva kollha inklużi l-fajls kollha inklużi. Jekk wara bidla xi ħaġa tmur ħażin, it-tqabbil juri minnufih x'inbidel. Fil-vulnerabbiltà kritika li jmiss għandek ukoll bażi affidabbli għall-inventarju, mingħajr ma jkollok bżonn tiġbor il-fajls l-ewwel.

Suġġeriment

Ibdel il-konfigurazzjoni l-ewwel fuq ambjent ta' test jew fuq kopja tal-blokk server. Punt tad-dħul minsi, pereżempju callback tal-pagament, inkella jidher biss meta l-ordnijiet jieqfu.

Kif tgħin PHP SOS b'mod konkret?

  • Naqraw il-konfigurazzjoni: nevalwaw il-konfigurazzjoni kollha ta' Nginx b'nginx -T u nassenjaw kull trasferiment lil PHP lill-websajt u lill-pool tiegħu.
  • Niddeterminaw il-punti tad-dħul: flimkien mal-iżviluppaturi tiegħek niddeċiedu liema skripts iridu jiġu eżegwiti u nibblokkaw il-bqija.
  • Nimplimentaw u nittestjaw: nadattaw blokki server u pools, nivverifikaw b'nginx -t u nittestjaw formoli, toroq tal-pagament u uploads.
  • Nassiguraw b'mod permanenti: il-konfigurazzjoni ssir parti mit-Tisħiħ tas-server tagħna u mid-dokumentazzjoni tas-server tiegħek.

Mistoqsijiet frekwenti

Nginx irid jerġa' jinbeda wara aġġornament ta' PHP?

Għall-patch ta' PHP le, għax Nginx ma fihx PHP. Iridu jerġgħu jinbdew is-servizzi PHP-FPM kollha. Jekk ibiddel ukoll il-konfigurazzjoni ta' Nginx, ivverifikaha qabel b'nginx -t u imbagħad erġa' tgħabbi Nginx.

Għaliex nibgħat lil PHP biss index.php?

Ħafna applikazzjonijiet moderni għandhom punt tad-dħul wieħed, il-front controller. Jekk biss dan il-fajl jinbgħat lil PHP-FPM, fajl PHP introdott f'post ieħor ma jistax jiġi eżegwit mill-browser. Fi sistemi b'ħafna punti tad-dħul dan il-mudell mhuwiex possibbli.

X'jagħti security.limit_extensions f'PHP-FPM?

L-issettjar jiddetermina liema estensjonijiet ta' fajls PHP-FPM jesegwixxi bħala skript. Skont il-manwal ta' PHP l-istandard huwa .php .phar; jirrakkomanda li jiġi llimitat għal .php. Dan jaqbad żbalji fil-konfigurazzjoni tas-server tal-web, imma ma jissostitwihiex.

Regoli ta' Nginx humiex protezzjoni kontra PHP2Shell?

Le. PHP2Shell jinsab fl-interpretatur ta' PHP u jingħalaq biss bl-aġġornament għal verżjoni rranġata u r-restart tal-workers kollha. Konfigurazzjoni sikura ta' Nginx tnaqqas is-superfiċje ta' attakk u tillimita d-dannu wara dħul.

Sorsi

Kuntatt immedjat

Kull siegħa tgħodd. Iktbu lilna issa.

Iddeskrivu fil-qosor is-sistema, il-verżjoni ta' PHP u dak li osservajtu. Nikkuntattjawkom, niċċaraw is-sitwazzjoni u naħdmu mill-bogħod sakemm l-inċident jingħalaq u jiġi ddokumentat.

Għajnuna immedjata