PHP: Safe Mode - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links 
search for in the  
previous�lland� adatb�zis kapcsolatokUsing PHP from the command linenext
Last updated: Fri, 30 Aug 2002
view the printer friendly version or the printer friendly version with notes or change language to English | Brazilian Portuguese | Chinese | Czech | Dutch | Finnish | French | German | Italian | Japanese | Korean | Polish | Romanian | Russian | Spanish | Swedish | Turkish

Fejezet 24. Safe Mode

A safe mode egy pr�b�lkoz�s a megosztott szerverek biztons�gi probl�m�inak megold�s�ra. Architekt�r�lisan nem korrekt, hogy ezt a probl�m�t a PHP szintj�n pr�b�ljuk megoldani, de mivel a t�bbi alternat�va a webszerver �s oper�ci�s rendszer szinteken nem igaz�n haszn�lhat�, sokan - k�l�n�sen az internetszolg�ltat�k - a safe mode-ot haszn�lj�k egyel�re.

A safe mode m�k�d�s�t befoly�sol� be�ll�t�sok:
safe_mode = Off
safe_mode_gid = 0
safe_mode_include_dir = 
safe_mode_exec_dir =
open_basedir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_fnctions =

Ha a safe_mode be�ll�t�s be van kapcsolva, a PHP ellen�rzi, hogy az aktu�lisan fut� szkript tulajdonosa megegyezik-e a kezel�sre megnyitand� file tulajdonos�val. P�ld�ul:
-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php 
-rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd
Futtatva ezt a script.php programot:
<?php
 readfile('/etc/passwd'); 
?>
a k�vetkez� hib�t kapod, ha a safe mode be van kapcsolva:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not 
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2

Ha a safe_mode helyett egy open_basedir k�nyvt�rat �ll�tasz be, akkor minden enged�lyezett file m�velet erre a k�nyvt�rra korl�toz�dik. P�ld�ul (Apache httpd.conf p�lda):
<Directory /docroot>
php_admin_value open_basedir /docroot 
</Directory>
Ha a fenti script.php programot futtatod, ezzel az open_basedir be�ll�t�ssal, akkor a k�vetkez� eredm�nyt kapod:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2

Le tudsz tiltani k�l�nb�z� f�ggv�nyeket ak�r egyenk�nt is. Meg kell azonban jegyezni, hogy a disable_functions be�ll�t�s csak a php.ini-ben haszn�lhat�. Ez azt jelenti, hogy nem tudsz virtu�lis hosztonk�nt, vagy k�nyvt�rank�nt f�ggv�nyeket letiltani a httpd.conf vagy .htaccess �llom�nyokban. Ha hozz�adod ezt a php.ini �llom�nyodhoz:
disable_functions readfile,system
A k�vetkez� hib�t kapod:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2

A safe mode haszn�latakor tiltott/korl�tozott f�ggv�nyek

Ez m�g val�sz�n�leg nem teljes, �s nem korrekt list�ja a f�ggv�nyeknek, amiket a safe mode korl�toz.

T�bl�zat 24-1. Safe modeban korl�tozott f�ggv�nyek

F�ggv�nyKorl�toz�s
dbmopen()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
dbase_open()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
filepro()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
filepro_rowcount()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
filepro_retrieve()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
ifx_*()sql_safe_mode megk�t�sek, (!= safe mode)
ingres_*()sql_safe_mode megk�t�sek, (!= safe mode)
mysql_*()sql_safe_mode megk�t�sek, (!= safe mode)
pg_loimport()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
posix_mkfifo()Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program.
putenv()Alkalmazkodik a safe_mode_protected_env_vars �s safe_mode_allowed_env_vars ini be�ll�t�sokhoz. L�sd m�g a putenv() le�r�s�t
move_uploaded_file()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
chdir()Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program.
dl()Ez a f�ggv�ny nem haszn�lhat�, ha a safe mode be van kapcsolva.
v�grehajt� oper�torEz a f�ggv�ny nem haszn�lhat�, ha a safe mode be van kapcsolva.
shell_exec() (a v�grehajt� oper�tor f�ggv�ny megfelel�je)Ez a f�ggv�ny nem haszn�lhat�, ha a safe mode be van kapcsolva.
exec()Futtathat� �llom�nyok v�grehajt�s�ra csak a safe_mode_exec_dir k�nyvt�ron bel�l van lehet�s�g. Praktikus okok miatt nem lehets�ges .. komponenst elhelyeni a futtatand� program el�r�si �tj�ban.
system()Futtathat� �llom�nyok v�grehajt�s�ra csak a safe_mode_exec_dir k�nyvt�ron bel�l van lehet�s�g. Praktikus okok miatt nem lehets�ges .. komponenst elhelyeni a futtatand� program el�r�si �tj�ban.
passthru()Futtathat� �llom�nyok v�grehajt�s�ra csak a safe_mode_exec_dir k�nyvt�ron bel�l van lehet�s�g. Praktikus okok miatt nem lehets�ges .. komponenst elhelyeni a futtatand� program el�r�si �tj�ban.
popen()Futtathat� �llom�nyok v�grehajt�s�ra csak a safe_mode_exec_dir k�nyvt�ron bel�l van lehet�s�g. Praktikus okok miatt nem lehets�ges .. komponenst elhelyeni a futtatand� program el�r�si �tj�ban.
mkdir()Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program.
rmdir()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
rename()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program.
unlink()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program.
copy()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program. (a source �s target param�terekre)
chgrp()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
chown()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
chmod()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program. R�ad�sul nem �ll�thatod �t a SUID, SGID �s sticky biteket
touch()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program.
symlink()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program. (csak a c�l ellen�rz�tt)
link()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program. Ellen�rzi, hogy a k�nyvt�r, amelyben dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkezik-e, mint az �ppen fut� program. (csak a c�l ellen�rz�tt)
ob_gzhandler()Ellen�rzi, hogy az �llom�nyok/k�nyvt�rak, amelyekkel dolgozni szeretn�l, ugyanazzal a felhaszn�l�i azonos�t�val (UID) rendelkeznek-e, mint az �ppen fut� program.
getallheaders()Safe modeban, semmilyen 'authorization' (nem kisbet�/nagybet� �rz�keny) kezdet� fejl�c sem ker�l visszaad�sra. Figyelem: ez nem m�k�dik megfelel�en a getallheaders() AOL szerveres megval�s�t�s�ban.
Minden f�ggv�ny, ami a php4/main/fopen_wrappers.c funkci�kat haszn�lja. ??

User Contributed Notes
Safe Mode
add a note about notes
Marc Delisle
16-Jul-2001 09:49

include() and require() are also limited by safe mode.
[email protected]
08-Sep-2001 01:17

Many filesystem-related functions are not appropriately restricted when Safe Mode is activated on an NT server it seems. I would assume that this is due to the filesystem not making use of UID.

In all of my scripts, no matter WHO owns the script (file Ownership-wise) or WHO owns the directory/file in question; both UIDs display

(getmyuid() and fileowner()) as UID = 0

This has the rather nasty side effect of Safe Mode allowing multiple filesystem operations because it believes the script owner and file/dir owner are one and the same.

While this can be worked around by the judicious application of proper filesystem privileges, it's still a "dud" that many of Safe Mode's securities are simply not there with an NT implementation.

phobo#paradise.net.nz
03-Oct-2001 01:21

If you do virutal hosting, you can turn safe mode on and off for different Apache Virutal Hosts using the php_admin_value directive. This also allows you to have customised maximum execution times, disabled functions, etc. By placeing a base_dir for each virutal host, this means PHP CANNOT access files below this heirachy; strongly recoomended for cutsomer hosting.

Eg:

[VirtualHost 127.0.0.1:80]
DocumentRoot /var/www/html/safephphost/
ServerName safephp
php_admin_value safe_mode 1
php_admin_value open_basedir /var/www/html/safephphost/
php_admin_value sendmail_from phobo#paradise.net.nz
[/VirtualHost]

[email protected]
24-Jan-2002 10:45

Just to note, I created patch which allows VirtualHost to set User under which all (PHP too) runs. It is more secure than safe_mode. See luxik.cdi.cz/~devik/apache/ if you are interested
zebz@ihaveenoughspam_hotmail.com
28-Apr-2002 02:42

All the filesystem-related functions (unlink, fopen, unlink, etc) seems to be restricted the same way in safe mode, at least on PHP 4.2. If the file UID is different *but* the directory (where the file is located) UID is the same, it will work.

So creating a directory in safe mode is usually a bad idea since the UID will be different from the script (it will be the apache UID) so it won't be possible to do anything with the files created on this directory.

[email protected]
01-Jun-2002 11:11

This is just a reply to phobo#paradise.net.nz about the virtual server. This no longer works on apache, if you do try you will get:
Syntax error on line 1118 of /usr/www/conf/httpd.conf:
php_admin_value not allowed here

[email protected]
13-Jun-2002 09:37

You can a vhost.conf file.

<Directory /vhosts/domain.com/httpdocs/>
php_admin_value safe_mode 0
php_admin_value open_basedir "/"
</Directory>

19-Jun-2002 08:44
disable_functions must use "=" operator to assign value. Please correct exemple.
[email protected]
07-Jul-2002 06:51

[email protected] wrote in his comment of 02-Oct-2001 07:21: "By placeing a base_dir for each virutal host, this means PHP CANNOT access files below this heirachy"

"below" or "above" is obviously a matter of visualization. The way I understand open_basedir is if you add an open_basedir clause as in the example provided, php is ONLY able to access files under the /var/www/html/safephphost/ directory. In other words php will not be able to access /var/www/html/anotherfile but will be able to access /var/www/html/safephphost/somefile.

Also - if I understand correctly you do not need "safe_mode on" when you have an open_basedir clause. (ref: "If instead of safe_mode, you set an open_basedir directory then all file operations will be limited to files under the specified directory")

iam4webwork at hotmail dot com
11-Jul-2002 04:59

Had to run ImageJPEG() and ImagePNG() out of safe mode in order to finally get them to work. My site is on a machine that uses Linux, PHP 4.1.2, GD 1.6.2 and employs safe mode. To get out of safe mode, had to name the script with a .cgi extension and insert #!/usr/bin/php line at top of script.
[email protected]
19-Jul-2002 07:33

open_basedir only restricts file operations to files and directories under a specified directory, but you can still user system ("vi /home/somedir/somefile"), so safe_mode still has a place here as it is much more restrictive then open_basedir.

Also, to reply to someone who said that 'above' and 'below' was a matter of perspective, sure it is. Of course, a file is not under another one, etc, it just pointed by some inode. But in the common language we consider the root (/) to be above everything else, and /home is below root, and /home/myfile is below /home. There is no written standard, but most people (those I know anyway) agree on that syntax.

[email protected]
28-Aug-2002 09:36

Just in reply to [email protected] and phobo#paradise.net.nz:

You can again use php_admin_value with apache2.0.40 and php4.2.3-dev.

There is also a bug with safe_mode which can be patched with

[email protected]
30-Aug-2002 06:40

set_time_limit() is also disabled by safe mode
add a note about notes
previous�lland� adatb�zis kapcsolatokUsing PHP from the command linenext
Last updated: Fri, 30 Aug 2002
show source | credits | stats | mirror sites
Copyright © 2001, 2002 The PHP Group
All rights reserved.
This mirror generously provided by:
Last updated: Sat Aug 31 06:19:44 2002 CEST