Ce probleme de securitate ar trebui să am în vedere când setez FS_METHOD la "direct" în wp-config?
Recent am întâmpinat o problemă în care nu am putut instala plugin-ul WP Smush Pro deoarece nu am disponibile opțiunile de Instalare Manuală sau Instalare cu Un Click.
Am găsit această postare care sugera modificarea setărilor în wp-config.php
. Am adăugat setările sugerate, însă cea care pare să fie cea mai importantă este:
define('FS_METHOD', 'direct');
Aș dori să știu ce probleme reale de securitate ar trebui să am în vedere când setez FS_METHOD
la direct
? Există alte alternative pentru instalarea plugin-ului?
Iată ce spune documentația oficială:
FS_METHOD forțează metoda sistemului de fișiere. Ar trebui să fie doar "direct", "ssh2", "ftpext" sau "ftpsockets". În general, ar trebui să modificați acest lucru doar dacă întâmpinați probleme la actualizare. Dacă îl modificați și nu ajută, schimbați-l înapoi/eliminați-l. În majoritatea circumstanțelor, setarea la 'ftpsockets' va funcționa dacă metoda aleasă automat nu funcționează.
(Preferință Primară) "direct" forțează utilizarea cererilor Direct File I/O din PHP, acest lucru poate genera probleme de securitate pe host-urile configurate necorespunzător. Această metodă este aleasă automat când este considerată adecvată.

Aceasta este doar cum am înțeles eu ideea din spatele WordPress File API. Dacă este greșit, vă rog să dați vot negativ :)
Bine. Dacă încărcați un fișier, acel fișier are un proprietar. Dacă încărcați fișierul prin FTP, vă autentificați și fișierul va fi deținut de utilizatorul FTP. Deoarece aveți credențialele, puteți modifica aceste fișiere prin FTP. Proprietarul poate de obicei executa, șterge, modifica etc. fișierul. Desigur, puteți schimba acest lucru prin modificarea permisiunilor fișierului.
Dacă încărcați un fișier folosind PHP, utilizatorul Linux care execută PHP este proprietarul fișierului. Acest utilizator poate acum edita, șterge, executa etc. fișierul. Acest lucru este în regulă atâta timp cât doar dumneavoastră sunteți utilizatorul care execută PHP pe sistemul dumneavoastră.
Să presupunem că sunteți pe un host partajat configurat "slab". Mulți oameni rulează site-urile lor PHP pe acest sistem. Să spunem că un singur utilizator Linux execută PHP pentru toți acești oameni. Unul dintre administratorii de pe acest host partajat are intenții rele. El vede pagina dumneavoastră și își dă seama de calea către instalarea WordPress. De exemplu, WP_DEBUG este setat pe true și apare un mesaj de eroare precum
[warning] /var/www/vhosts/userxyz/wp-content/plugins/bad-plugin/doesnt-execute-correctly.php on line 1
"Ha!" spune băiatul rău. Să vedem dacă acest tip a setat FS_METHOD
la direct
și scrie un script ca
<?php
unlink( '/var/www/vhosts/userxyz/wp-content/plugins/bad-plugin/doesnt-execute-correctly.php' );
?>
Deoarece un singur utilizator rulează PHP și acest utilizator este folosit și de băiatul rău, el poate modifica/șterge/executa fișierele de pe sistemul dumneavoastră dacă le-ați încărcat prin PHP și astfel ați atașat utilizatorul PHP ca proprietar.
Site-ul dumneavoastră este hack-uit.
Sau, cum se spune în Codex:
Multe sisteme de hosting au serverul web rulând ca un utilizator diferit decât proprietarul fișierelor WordPress. Când acest lucru se întâmplă, un proces care scrie fișiere din utilizatorul serverului web va avea fișierele rezultate deținute de contul utilizatorului serverului web în loc de contul utilizatorului real. Acest lucru poate duce la o problemă de securitate în situații de hosting partajat, unde mai mulți utilizatori împărtășesc același server web pentru diferite site-uri.

Care este riscul?
Pe un host partajat configurat prost, PHP-ul fiecărui client va fi executat ca același utilizator (să spunem apache
pentru discuție). Această configurație este surprinzător de comună.
Dacă ești pe un astfel de host și folosești WordPress pentru a instala plugin-ul folosind acces direct la fișiere, toate fișierele tale de plugin vor aparține utilizatorului apache
. Un utilizator legitim de pe același server ar putea să te atace scriind un script PHP care injectează cod rău intenționat în fișierele tale de plugin. Ei încarcă scriptul lor pe propriul website și îi solicită URL-ul. Codul tău este compromis cu succes deoarece scriptul lor rulează ca apache
, același utilizator care deține fișierele tale de plugin.
Ce legătură are FS_METHOD 'direct'
cu asta?
Când WordPress are nevoie să instaleze fișiere (cum ar fi un plugin), folosește funcția get_filesystem_method() pentru a determina cum să acceseze sistemul de fișiere. Dacă nu definești FS_METHOD
, acesta va alege o valoare implicită pentru tine, altfel va folosi selecția ta atâta timp cât are sens.
Comportamentul implicit va încerca să detecteze dacă te afli într-un mediu riscant precum cel descris mai sus și, dacă consideră că ești în siguranță, va folosi metoda 'direct'
. În acest caz, WordPress va crea fișierele direct prin PHP, făcându-le să aparțină utilizatorului apache
(în acest exemplu). Altfel, va reveni la o metodă mai sigură, cum ar fi solicitarea credențialelor SFTP și crearea fișierelor ca și tine.
FS_METHOD = 'direct'
cere WordPress să ocolească acea detectare a riscului și să întotdeauna creeze fișiere folosind metoda 'direct'
.
Atunci de ce să folosești FS_METHOD = 'direct'
?
Din păcate, logica WordPress pentru detectarea unui mediu riscant este defectuoasă și produce atât false-pozitive cât și false-negative. Hopa. Testul implică crearea unui fișier și verificarea faptului că aparține aceluiași proprietar ca și directorul în care se află. Presupunerea este că, dacă utilizatorii sunt aceiași, PHP rulează ca propriul tău cont și este sigur să instalezi plugin-uri ca acel cont. Dacă sunt diferiți, WordPress presupune că PHP rulează ca un cont partajat și nu este sigur să instalezi plugin-uri ca acel cont. Din păcate, ambele presupuneri sunt estimări educate care vor fi adesea greșite.
Ai folosi define('FS_METHOD', 'direct' );
într-un scenariu de fals-pozitiv precum acesta: faci parte dintr-o echipă de încredere ai cărei membri încarcă fișiere prin propriile conturi. PHP rulează ca propriul utilizator separat. WordPress va presupune că acesta este un mediu riscant și nu va folosi modul implicit 'direct'
. În realitate, este partajat doar cu utilizatori de încredere și, ca atare, modul 'direct'
este sigur. În acest caz, ar trebui să folosești define('FS_METHOD', 'direct' );
pentru a forța WordPress să scrie fișiere direct.

Mulțumesc @mark, a fost foarte util! Poate fi necesar să actualizați linkul pentru get_filesystem_method()
cu acesta: https://developer.wordpress.org/reference/functions/get_filesystem_method/

Există o situație 'bine-configurată' în care opțiunea 'direct' va duce la probleme.
De asemenea, este posibil să configurezi un hosting WordPress partajat cu utilizatori de execuție PHP nepartajați, diferiți de utilizatorii care dețin drepturile asupra fișierelor/directoarelor. Astfel, ajungi să ai fișierele deținute de user1, iar codul PHP este executat ca php-user1.
În această situație, plugin-uri sau cod de nucleu compromis (a) nu pot scrie (sau chiar citi, în funcție de permisiuni) directoarele altor utilizatori; (b) nu pot scrie fișierele acestui utilizator și astfel nu pot adăuga cod troian în nucleu sau în codul plugin-urilor.
Deci, dacă hosting-ul este configurat în acest fel, TREBUIE să folosești FTP pentru actualizări, iar opțiunea 'direct' nu va funcționa.
Dacă setezi 'direct' în wp-config.php și utilizatorul de execuție PHP nu are permisiuni de scriere, vei primi mesaje de tip Actualizare eșuată și nu va apărea niciun pop-up care să solicite credențialele FTP.
