Problem je totiz v tom, ze zadne obecne a dostatecne uspokojive reseni proste s klasickym modelem apache + mod_php neexistuje a ani existovat nemuze.
Apache bezi pod nejakym svym uzivatelem. Pokud by to byl root, pak by sice mohl fungovat treba nejaky takovy patch, ktery zminuje tvx, ale bezpecnostni dusledky behani apache pod rootem jsou natolik ohromne, ze se vubec nedivim, ze si to nikdo neriskne (nejde ani tak o apache samotneho, jako spis o nektere externi veci typu PHP ci OpenSSL, ktera nemaji vubec dobrou bezpecnostni historii ani soucasnost). Dalo by se samozrejme toho roota orezat natolik, aby mel co nejmensi prava (pomoci ruznych systemovych ACL nebo capabilities), ale nevim o tom, ze by si nejaky hosting veril natolik, aby tohle implementoval.
Takze tedy nemame apache pod rootem a nejaky patch co upravuje prava dodatecne je mimo hru. Asi by se dal udelat nejaky externi proces pod rootem, ktery by na zadost apache jenom menil prava uzivatelu, ale... i to je asi pomerne snadno zneuzitelne. Uzivatel si sam zmenit vlastnictvi skriptu nemuze. Je zde tedy moznost mit skripty vlastnene primo uzivatelem, pod kterym bezi webserver. UID novych souboru a adresaru se bude rovnat tomu UID, ktery ma skript. To je super, jenze... to jaksi uz nema cenu provozovat safe_mode vubec, kdyz udelame tohle (vsechno bude mit jednoho vlastnika).
Pokud se nepletu, tak pokud mame adresar vlastneny vlastnikem skriptu, a soubory v nem jsou vlastneny apachem, neni problem pri zapnutem safe_mode se soubory v takovem adresari manipulovat, davat tam jine etc. Tudiz pokud si adresare predem pripravime, uploady to nezkazi, manipulace to nezkazi. Zkazi to mkdir, ktery vytvori adresar vlastneny apachem a v tom uz neudelame ani tuk. Proto nektere lepsi webove aplikace umi vytvaret adresare primo pres ftp.
Existuje jeden zpusob, jak se to da resit. Zapne se safe_mode nikoli podle uidu, ale podle gidu. A gid se da dedit. Lze zajistit, aby se gid podedil od otcovskeho adresare. Tudiz pak apache muze vesele vytvaret veci pod sebou, vytvorene adresare zdedi gid od sveho adresare rodicovskeho, soubory taky a php porovnava gid a vsechno funguje presne jak ma i se zapnutym safemode. Jenze... je to too good to be true. Na svete existuje asi tak miliarda PHP vyvojaru, co si mysli, ze vsechny webservery jsou nakonfigurovane stejne, a prvni co udelaji jakmile vytvori soubor nebo adresar, je to, ze tam vesele naperou chmod(777), cimz zrusi priznak dedicnosti GID a je po srande, metoda opet selhava.
Problem safe_mode i open_basedir (ktera asi jako jedina casem zustane) je jeste jiny. Vse je to vynucovane pouze v PHP a vzhledem k tomu, kolik funkci a rozsireni v PHP je, se nejde tak stoprocentne spolehnout na to, ze skutecne vsechny toto budou respektovat a kazdou chvili se prave najde chyba typu obejiti open_basedir nebo obejiti safe_mode... Je lepsi mit asi zapnute obe dve a doufat.
Mozna o neco lepsi je nepouzivat mod_php, ale mod_fcgid s fastcgi verzi PHP. To se ale velmi obtizne (az nerealisticky obtizne) udrzuje pri vetsim mnozstvim virtualhostu, chova se to obcas trochu divne. Ale vyhoda je jasna - muze to bezet primo pod uzivatelem vlastnicim dane skripty, tudiz je to bezpecnostne uplne jinde, nez safe_mode ci open_basedir (bezpecnost zde vynucuje system) a problemy se safe_mode odpadaji. |