Unul dintre elementele de siguranta ale PHP este si parametrul open_basedir , care se asigura ca un script PHP nu poate accesa un fisier aflat in afara locatiei/locatiilor permise.
Atunci cand un script php incearca accesarea unui fisier, de exemplu cu fopen() sau gzopen(), se verifica locatia fisierului. Daca fisierul se afla in afara locatiei permise, PHP va refuza sa-l deschida si va returna urmatoarea eroare:
PHP Warning: fopen(): open_basedir restriction in effect. File(/var/www/vhosts/host_name/folder_name/filename.txt) is not within the allowed path(s): (/var/www/vhosts/host_name/other_folder_name/:/tmp/) in /var/www/vhosts/host_name/script.php on line 27
Eroarea apare in log-ul server-ului de http, Apache (error_log).
Exista mai multe solutii pentru aceasta problema: dezactivarea protectiei open_basedir din php, excluderea protectiei pentru anumiti utilizatori sau domenii/subdomenii, sau acordarea permisiunii de acces pe folder-ul specificat.
In cazul utilizarii cPanel se poate dezactiva cu usurinta protectia open_basedir: Security -> Tweak security ->Configure (pentru “Php open_basedir Tweak”). Aici se poate activa/dezactiva protectia open_basedir sau se pot include/exclude zone pentru protectie.
In cazul utilizarii Plesk (cazul meu), trebuie editat manual fisierul vhost.conf si fisierul vhost_ssl.conf (daca e cazul) aflat la locatia /var/www/vhosts/host_name/conf/vhost.conf
. Daca fisierul nu exista, trebuie creat. Acest fisier se modifica dupa cum urmeaza:
Pentru dezactivarea optiunii open_basedir:
<Directory /var/www/vhosts/host_name/folder_name> php_admin_value open_basedir "none" </Directory>
Pentru acordarea accesului pentru anumite locatii:
<Directory /var/www/vhosts/host_name/folder_name> php_admin_value open_basedir "/var/www/vhosts/host_name/:/var/www/vhosts/other_host_name/folder_name/:/tmp" </Directory>
Pentru dezactivarea open_basedir si pentru specificarea locatiilor incluse:
<Directory /var/www/vhosts/host_name/folder_name> php_admin_value open_basedir "none" php_admin_value include_path "/var/www/vhosts/host_name/:/var/www/vhosts/other_host_name/folder_name/:/tmp:/usr/share/pear/" </Directory>
Merita notat faptul ca atunci cand prin open_basedir se specifica locatiile in care se permite accesul, aceasta valoare este doar un prefix si nu un nume de director. Aceasta inseamna ca
open_basedir=/var/www/vhosts/host_name
va permite accesul si la
/var/www/vhosts/host_name_1
precum si la
/var/www/vhost/host_name_2
Pentru a restrictiona accesul doar la directoarele specificate, la sfarsit trebuie pus un slash (/):
open_basedir=/var/www/vhosts/host_name/
Leave a Reply