Īsi: CGI (Common Gateway Interface) ir sena saskarne, kurā tīmekļa serveris katram pieprasījumam startē jaunu programmu, PHP gadījumā programmu php-cgi. FastCGI ir tālākā attīstība: PHP procesi darbojas pastāvīgi un pieņem daudzus pieprasījumus caur socket. PHP-FPM ir svarīgākā FastCGI realizācija PHP. Drošībai svarīgi galvenokārt ir cgi.* iestatījumi un noteikums, ka FastCGI piekļuve nekad nedrīkst būt publiski sasniedzama.
Kas ir CGI?
CGI ir viena no vecākajām metodēm, ar kuru tīmekļa serveri ģenerē dinamisku saturu. PHP rokasgrāmata pie iestatījuma cgi.rfc2616_headers atsaucas uz RFC 3875, Common Gateway Interface specifikāciju. Arī PHP pirmsākumi bija CGI programmas: Rasmus Lerdorf 1994. gadā uzrakstīja pirmos „Personal Home Page Tools“ kā CGI bināros failus C valodā.
Princips: katram pieprasījumam tīmekļa serveris startē jaunu procesu, nodod pieprasījuma datus caur vides mainīgajiem un standarta ievadi un nolasa atbildi no standarta izvades. Pēc tam process beidzas. Saskaņā ar PHP rokasgrāmatu PHP CGI un CLI gadījumā savu php.ini nolasa no jauna katrā izsaukumā, servera moduļu gadījumā tikai startējot.
Tas padara CGI noturīgu, jo katrs pieprasījums sākas ar svaigu procesu. Taču tas padara CGI arī lēnu: procesa startēšana, konfigurācijas ielāde un paplašinājumu inicializēšana katrā pieprasījumā prasa laiku.
Kas ir FastCGI?
FastCGI veiktspējas problēmu risina, uzturot procesus dzīvus. Tīmekļa serveris caur Unix socket vai TCP portu savienojas ar darbojošos procesu un nosūta tam pieprasījumu FastCGI protokolā. Process to apstrādā un gaida nākamo.
| Pazīme | CGI | FastCGI ar php-cgi | FastCGI ar PHP-FPM |
|---|---|---|---|
| Process katram pieprasījumam | jā | nē | nē |
| SAPI nosaukums | cgi-fcgi |
cgi-fcgi |
fpm-fcgi |
| Pūli ar savu lietotāju | nē | nē | jā |
| Procesu vadība | tīmekļa serveris | tīmekļa servera modulis, piem., mod_fcgid | savs master process |
.user.ini tiek nolasīts |
jā | jā | jā |
PHP-FPM saskaņā ar rokasgrāmatu ir PHP primārā FastCGI implementācija. Tas protokolu papildina ar procesu pārvaldību, pūliem, statusa lapām un slowlog. Detaļas skatiet sadaļā PHP-FPM izskaidrots.
cgi iestatījumi php.ini
CGI darbībai PHP ir savi iestatījumi. Turpmākās vērtības un apraksti ņemti no PHP rokasgrāmatas:
cgi.force_redirect(noklusējums 1,INI_SYSTEM): saskaņā ar rokasgrāmatu nepieciešams, lai PHP kā CGI pie lielākās daļas tīmekļa serveru darbotos droši. Izslēgt tikai „uz paša risku“; IIS tam jābūt izslēgtam.cgi.fix_pathinfo(noklusējums 1,INI_SYSTEM): nodrošina pareizasPATH_INFOunPATH_TRANSLATEDvērtības. Skriptiem jāizmantoSCRIPT_FILENAME, nevisPATH_TRANSLATED.cgi.discard_path(noklusējums 0,INI_SYSTEM): ļauj CGI bināro failu droši novietot ārpus tīmekļa direktorija, neapejot.htaccessaizsardzību.fastcgi.impersonate(noklusējums 0,INI_SYSTEM): svarīgs tikai IIS sistēmā Windows.user_ini.filenameunuser_ini.cache_ttl(noklusējums.user.iniun 300 sekundes): nosaka, vai un cik bieži PHP nolasa.user.inifailus.
Nginx gadījumā tam pieder arī tīra skripta ceļa nodošana. Lasāms pamatparaugs, bez garantijas katrai videi:
location ~ \.php$ {
try_files $uri =404; # PHP nodot tikai esošus failus
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Rinda try_files $uri =404; neļauj pieprasījumus uz neesošiem .php ceļiem nodot tālāk PHP.
Kāpēc atklāta FastCGI piekļuve ir bīstama
PHP rokasgrāmata skaidri brīdina: kas var atvērt FastCGI savienojumu ar PHP, kontrolē pieprasījuma konfigurāciju, piemēram, auto_prepend_file, un tādējādi var izpildīt jebkuru kodu. Iemesls ir tas, ka tīmekļa serveri PHP iestatījumus drīkst līdzi nosūtīt ar FastCGI parametriem, piemēram, PHP_VALUE un PHP_ADMIN_VALUE.
No tā izriet skaidri noteikumi:
- PHP-FPM vai php-cgi FastCGI režīmā pieslēgt tikai caur Unix socket, ja tīmekļa serveris darbojas tajā pašā resursdatorā.
- TCP gadījumā iestatīt
listen.allowed_clientsun portu bloķēt ugunsmūrī; norādes skatiet rakstā Ugunsmūris tīmekļa serverim. - Socket tiesības ar
listen.owner,listen.groupunlisten.modeturēt šauras.
Ar ss -lntp | grep -i php pārbaudiet, vai kāds PHP process klausās TCP adresē. Piesaiste pie 0.0.0.0 vai publiskas adreses ir steidzams rīcības gadījums.
CGI, FastCGI un PHP2Shell
PHP2Shell skar gan php-cgi, gan PHP-FPM. Abiem ir spēkā: atjauninājums uz 8.5.12, 8.4.27, 8.3.36 vai 8.2.35 vai apstiprināts backport, pēc tam visi darbojošies PHP procesi jāpabeidz un jāpārstartē. FastCGI risinājumos ar php-cgi procesi bieži turpina darboties nemanāmi, jo tos nepārvalda neviens atsevišķs pakalpojums. Kā šo mantojumu atrast un aizstāt, skatiet sadaļā php-cgi: mantojums ar risku. Plesk šie varianti saucas citādi; palīdzību sniedz Plesk: PHP apstrādātāju izpratne.
Kā PHP SOS palīdz konkrēti?
- Apzināt apstrādātājus: Mēs noskaidrojam, vai jūsu vietnes darbojas caur CGI, FastCGI ar php-cgi vai PHP-FPM.
- Aizvērt piekļuves: Mēs pārbaudām sockets, portus un ugunsmūra noteikumus, lai neviena FastCGI piekļuve nebūtu sasniedzama no ārpuses.
- Ielāpot un sakopt: Mēs atjauninām PHP un pabeidzam visus vecos procesus, arī pamestās php-cgi instances.
- Aizstāt: Servera nostiprināšanas ietvaros mēs CGI mantojumu aizstājam ar PHP-FPM ar atsevišķiem pūliem.
Biežāk uzdotie jautājumi
Vai FastCGI ir tas pats, kas PHP-FPM?
Nē. FastCGI ir protokols, caur kuru tīmekļa serveris sazinās ar lietojumprogrammas procesu. PHP-FPM ir programma, kas šo protokolu realizē PHP un pārvalda procesus. Arī php-cgi var runāt FastCGI, taču tam nav pūlu.
Kāpēc tīrs CGI tiek uzskatīts par novecojušu?
CGI gadījumā tīmekļa serveris katram pieprasījumam startē jaunu procesu, un PHP katru reizi nolasa savu konfigurāciju. Tas prasa laiku un resursus. FastCGI un PHP-FPM uztur procesus pastāvīgi gatavībā un tāpēc ir ievērojami efektīvāki.
Kas ir .user.ini?
Fails .user.ini ir neliels konfigurācijas fails tīmekļa direktorijā. Saskaņā ar PHP rokasgrāmatu to nolasa tikai CGI un FastCGI SAPI, tātad arī PHP-FPM. Tajā drīkst būt tikai iestatījumi ar režīmiem INI_PERDIR, INI_USER vai INI_ALL.
Kā noteikt, vai manā serverī darbojas php-cgi?
Ar tikai lasošām komandām, piemēram, ps vai pgrep, meklējiet procesus ar nosaukumu php-cgi, un tīmekļa servera konfigurācijā skatieties ierakstus, piemēram, mod_fcgid, Action vai ScriptAlias ar php-cgi. Hostinga paneļos darbības režīmu bieži sauc par CGI vai FastCGI lietojumprogrammu.