Bölüm 23. Güvenli Kip

Ýçindekiler
Güvenli Kip tarafından kısıtlanan/iptal edilen fonksiyonlar

Güvenli kip paylaşımlı-sunucu kavramının getirdiği güvenlik sorunlarını çözmeye yönelik bir adımdır. Bu sorunu PHP seviyesinde çözmeye çalışmak, mimari açıdan doğru değildir, fakat HTTP sunucusu ve işletim sistemi seviyesindeki alternatifler çok gerçekçi olmadığından, çok sayıda kişi, özellike ISS'ler, şimdilik güvenli kipi kullanırlar.

Güvenli kipi kontrol eden direktifler şunlardır:
safe_mode = Off 
open_basedir = 
safe_mode_exec_dir = 
safe_mode_allowed_env_vars = PHP_ 
safe_mode_protected_env_vars = LD_LIBRARY_PATH 
disable_functions =

safe_mode'un aktif olduğu zamanlarda, PHP, dosya fonksiyonlarıyla bir dosya üzerinde işlem yapmadan önce o dosyayla çalışmakta olan betiğin sahiplerini karşılaştırır. Örneğin:
-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
Bu betiği çalıştırmak:
<?php
 readfile('/etc/passwd'); 
?>
Güvenli kipin açık olduğu zamanlarda şunun gibi bir hata ile sonuçlanır:
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

Eğer safe_mode yerine, open_basedir ile bir dizin belirtirseniz, bütün dosya işlemleri belirtilen bu dizin altında gerçekleşecektir. Örneğin (Apache httpd.conf örneği):
<Directory /docroot>
  php_admin_value open_basedir /docroot 
</Directory>
Aynı script.php betiğini bu open_basedir ayarıyla çalıştırırsanız alacağınız sonuç:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2

Ayrıca istediğiniz fonksiyonların kullanımdan kaldırabilirsiniz. Bunu php.ini dosyamıza eklersek:
disable_functions readfile,system
Şu çıktıyı alırız:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2

Güvenli Kip tarafından kısıtlanan/iptal edilen fonksiyonlar

Safe Mode tarafından kısıtlanan fonksiyonların listesi büyük ihtimalle halen tam değil ve yanlış olması gayet mümkün:

Tablo 23-1. Güvenli Kip tarafından kısıtlanan fonksiyonlar

FonksiyonKısıtlama
dbmopen()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
dbase_open()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
filepro()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
filepro_rowcount()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
filepro_retrieve()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
ifx_*()sql_safe_mode kısıtlamaları, (!= Güvenli Kip)
ingres_*()sql_safe_mode kısıtlamaları, (!= Güvenli Kip)
mysql_*()sql_safe_mode kısıtlamaları, (!= Güvenli Kip)
pg_loimport()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
posix_mkfifo()Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder.
putenv()safe_mode_protected_env_vars ve safe_mode_allowed_env_vars ini-direktiflerine uyar. Ayrıca putenv() hakkındaki dökümanlara bakınız.
move_uploaded_file()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
chdir()Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder.
dl()Bu fonksiyon safe-mode da etkinleştirilemez.
ters tırnak işlemiBu fonksiyon safe-mode da etkinleştirilemez.
shell_exec() (ters tırnakların fonksiyonal eşi)Bu fonksiyon safe-mode da etkinleştirilemez.
exec()Sadece safe_mode_exec_dir ile belirtilen dizindeki programları çalıştırabilirsiniz. Pratiksel nedenlerden ötürü şu an için programa giden yolda .. olmasına izin verilmiyor.
system()Sadece safe_mode_exec_dir ile belirtilen dizindeki programları çalıştırabilirsiniz. Pratiksel nedenlerden ötürü şu an için programa giden yolda .. olmasına izin verilmiyor.
passthru()Sadece safe_mode_exec_dir ile belirtilen dizindeki programları çalıştırabilirsiniz. Pratiksel nedenlerden ötürü şu an için programa giden yolda .. olmasına izin verilmiyor.
popen()Sadece safe_mode_exec_dir ile belirtilen dizindeki programları çalıştırabilirsiniz. Pratiksel nedenlerden ötürü şu an için programa giden yolda .. olmasına izin verilmiyor.
mkdir()Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder.
rmdir()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
rename()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder. Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder.
unlink()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder. Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder.
copy()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder. Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder. (kaynak ve hedef için)
chgrp()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
chown()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder.
chmod()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder. Ek olarak SUID, SGID ve sticky bitlerini açamazsınız.
touch()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder. Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder.
symlink()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder. Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder. (not: sadece hedef kontrol ediliyor)
link()Betiği çalıştıran UID ile işlem yapılan dosya/dizinin aynı olup olmadığını kontrol eder. Betiği çalıştıran UID ile işlem yapılan dizinin aynı olup olmadığını kontrol eder. (not: sadece hedef kontrol ediliyor)
getallheaders()Güvenli Kipte, 'authorization' ile başlayan başlıklar (büyük/küçük harf ayrımı yok) döndürülmez. Uyarı: Bu getallheader() fonksiyonunun aol-server uyarlamasında bozuk!
php4/main/fopen_wrappers.c dosyasını kullanan tüm fonksiyonlar ??