Güvenli Kip
PHP Manual

Güvenlik ve Güvenli Kip

Güvenlik ve Güvenli Kip Yapılandırma Yönergeleri
İsim Öntanımlı Değişklik Yeri Sürüm Bilgisi
safe_mode "0" PHP_INI_SYSTEM PHP 6.0.0'da kaldırılmıştır.
safe_mode_gid "0" PHP_INI_SYSTEM PHP 4.1.0'dan beri kullanılabilmektedir. PHP 6.0.0'da kaldırılmıştır.
safe_mode_include_dir NULL PHP_INI_SYSTEM PHP 4.1.0'dan beri kullanılabilmektedir. PHP 6.0.0'da kaldırılmıştır.
safe_mode_exec_dir "" PHP_INI_SYSTEM PHP 6.0.0'da kaldırılmıştır.
safe_mode_allowed_env_vars "PHP_" PHP_INI_SYSTEM PHP 6.0.0'da kaldırılmıştır.
safe_mode_protected_env_vars "LD_LIBRARY_PATH" PHP_INI_SYSTEM PHP 6.0.0'da kaldırılmıştır.
open_basedir NULL PHP_INI_ALL PHP < 5.3.0'da PHP_INI_SYSTEM
disable_functions "" Sadece php.ini PHP 4.0.1'den beri kullanılabilmektedir.
disable_classes "" Sadece php.ini HP 4.3.2'den beri kullanılabilmektedir.

PHP_INI_* kiplerinin tanımları ve ayrıntılı açıklamaları için Yapılandırma ayarlarının yeri bölümüne bakınız.

Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.

safe_mode boolean

PHP'nin güvenli kipinin etkin olup olmayacağı. PHP --enable-safe-mode seçeneği ile derlenmişse öntanımlı olarak On (etkin), aksi takdirde Off'tur (etkisiz).

Uyarı

Bu özelliğin kullanımı PHP 5.3.0'dan beri ÖNERİLMEMEKTEDİR ve PHP 6.0.0'da tamamen KALDIRILACAKTIR. Bu özelliğe kesinlikle güvenmemelisiniz.

safe_mode_gid boolean

Dosya erişiminde UID (FALSE) veya GID (TRUE) denetimi yapılıp yapılmayacağı. Öntanımlı olarak güvenli kipte, dosyalar açılırken bir kullanıcı kimliği (UID) karşılaştırması yapılır. Bunu grup kimliğini (GID) denetleterek esnetmek isterseniz safe_mode_gid yönergesine On değerini atayabilirisiniz.

safe_mode_include_dir string

UID/GID denetimleri bu dizinde ve alt dizinlerinde es geçilir. (Dizinin ya tam yolu belirtilmeli ya da include_path yönergesinde de belirtilmelidir).

PHP 4.2.0'dan beri, bu yönergede include_path yönergesinde olduğu gibi, tek bir dizin belirtmek yerine aralarına ikinokta imi (Windows'da noktalı virgül imi) koymak suretiyle birden fazla dizin belirtilebilmektedir. Belirtilen dizinin sonuna bir bölü çizgisi konmadıkça dizin ismi bir önek olarak değerlerdirilir. Örneğin, "safe_mode_include_dir = /dir/incl" ile (varsa) hem "/dir/include" hem de "/dir/incls" dizini belirtilmiş olur. "safe_mode_include_dir = /dir/incl/" durumunda ise sadece /dir/incl dizini belirtilmiş olur. Bu yönergede boş değer belirtilirse PHP 4.2.3 ve PHP 4.3.3'ten itibaren farklı UID/GID'e sahip hiçbir dosya dahil edilmez. Önceki sürümlerde tüm dosyalar dahil edilirdi.
safe_mode_exec_dir string

PHP güvenli kipte kullanılıyorsa system() ve sistem programlarını çalıştırılan diğer işlevlerin bu dizinde olmayan programları çalıştırmasına izin verilmez. Windows dahil tüm ortamlarda dizin ayracı olarak / kullanmanız gerekir.

safe_mode_allowed_env_vars string

Bazı ortam değişkenlerinin kullanımı güvenlik açığı riski içerir. Bu yönergede virgül ayraçlı bir liste olarak önekler belirtilir. Güvenli kipte, kullanıcıların sadece bu yönergede önekleri belirtilen ortam değişkenlerini değiştirmelerine izin verilir. Kullanıcılar öntanımlı olarak sadece PHP_ ile başlayan ortam değişkenlerinde değişiklik yapabilirler (PHP_FOO=BAR gibi).

Bilginize: Bu yönergede boş değer belirtilmişse kullanıcıların tüm ortam değişkenlerinde değişiklik yapmalarına izin verilir!

safe_mode_protected_env_vars string

Bu yönergede, son kullanıcının putenv() kullanarak değiştiremeyeceği ortam değişkenleri virgül ayraçlı bir liste olarak belirtilir. Bu değişkenlerin önekleri safe_mode_allowed_env_vars yönergesinde belirtilmiş olsalar dahi, değiştirilmelerine izin verilmez.

open_basedir string

PHP tarafından dizin ağacı belirtilerek açılabilen dosyaları, dosyanın kendisi de dahil olmak üzere kısıtlar. Bu yönerge güvenli kipin etkin olup olmamasından etkilenmez.

Bir betik bir dosyayı örneğin fopen() veya gzopen() ile açmaya çalışırsa dosyanın bulunduğu yere bakılır. Dosya belirtilen dizin ağacının dışındaysa PHP dosyayı açmayı reddeder. Tüm sembolik bağlar çözümlenir. Dolayısıyla bu kısıtlamayı bir sembolik bağla aşmak mümkün değildir. Dosya mevcut değilse, sembolik bağ çözümlenemez ve dosya ismi open_basedir ile karşılaştırılır (veya çözümlenir).

Nokta (. ) özel değeri betiğin çalışma dizininin temel dizin olarak kullanılacağını belirtir. Ancak çalışma dizininin chdir() ile kolayca değiştirilebilmesi gibi küçük bir tehlike vardır.

httpd.conf dosyasında (örneğin bazı sanal konaklarda), "php_admin_value open_basedir none" ile herhangi bir yapılandırma yönergesi için yapılabildiği gibi open_basedir yönergesi de etkisiz kılınabilir.

Windows altında, dizinler bir noktalı virgül ile ayrılır. Diğer tüm sistemlerde bunun için ikinokta imi kullanılır. Bir Apache modülündeki gibi, üst dizinlerdeki open_basedir yolları da artık özdevinimli olarak miras alınmaktadır.

open_basedir ile belirtilen dizgeler bir tersbölü ile sonlandırılmadıkça aslında birer dizin değil önek belirtirler. Örneğin, "open_basedir = /dir/incl" ile (varsa) hem "/dir/include" hem de "/dir/incls" dizini belirtilmiş olur. "open_basedir = /dir/incl/" durumunda ise sadece /dir/incl dizini belirtilmiş olur.

Öntanımlı olarak tüm dosyaların açılmasına izin verilir.

Bilginize: PHP 5.3.0'dan beri open_basedir çalışma anında daha dar bir alanla sınırlanabilmektedir. Yani, open_basedir yönergesine php.ini dosyasında siteler/ dizini belirtilmişse çalışma anında bu, ini_set() ile siteler/temp/ diziniyle sınırlanabilir.

disable_functions string
Güvenlik adına belli işlevlere bu yönerge ile yasak konabilmektedir. İşlev isimleri virgül ayraçlı bir liste olarak belirtilebilir. Bu yönerge güvenli kipin etkin olup olmamasından etkilenmez. Bu yönerge sadece php.ini içinde kullanılmalıdır. Örneğin httpd.conf dosyasında bu yönergeyi kullanamazsınız.
disable_classes string
Güvenlik adına belli sınıflara bu yönerge ile yasak konabilmektedir. Sınıf isimleri virgül ayraçlı bir liste olarak belirtilebilir. Bu yönerge güvenli kipin etkin olup olmamasından etkilenmez. Bu yönerge sadece php.ini içinde kullanılmalıdır. Örneğin httpd.conf dosyasında bu yönergeyi kullanamazsınız.

Bilginize: Kullanılabilirlik bilgisi
Bu yönerge PHP 4.3.2'den beri kullanılabilmektedir,

Ayrıca bakınız: register_globals, display_errors ve log_errors.

safe_mode yönergesinin değeri On olduğu takdirde, PHP, betik sahibinin üzerinde çalışılan dosya veya dizin sahibiyle eşleşip eşleşmediğini denetler. Örneğin,

<?php
 readfile
('/etc/passwd');
?>

kodunu içeren betik.php betiği,

-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 betik.php
-rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd

ortamında çalıştırılırsa, güvenli kip etkin olduğu takdirde işlem şöyle bir hatayla 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/betik.php on line 2

Bununla birlikte, kesin UID sınamasının uygun olmadığı, esnek GID sınamasının yeterli olduğu sistemler olabilir. Bu durum, safe_mode_gid yönergesi ile sağlanabilir. Bu yönergeye On değeri vererek esnek GID sınaması, Off değeri (öntanımlıdır) vererek UID sınaması yaptırmak mümkündür.

safe_mode yönergesini etkin kılmak yerine, tüm dosya işlemlerini belli bir dizin altındaki dosyalarla sınırlamak için open_basedir yönergesini kullanabilirsiniz. Örneğin, bunu Apache httpd.conf dosyasında şöyle yapabilirsiniz:

<Directory /docroot>
  php_admin_value open_basedir /docroot
</Directory>

Önceki örnekteki betik.php dosyanızı bu open_basedir ayarı ile kullanırsanız şöyle bir sonuç alırsınız:

Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/betik.php on line 2

Ayrıca, işlevleri tek tek de iptal etmek mümkündür. Ancak, disable_functions yönergesi php.ini dosyası dışında kullanılamaz. Yani, bazı işlevlere erişimi, httpd.conf dosyanızda sanal konak veya dizin temelinde yasaklayamazsınız. php.ini dosyanızda şöyle bir satır varsa:

disable_functions = readfile,system

betik.php dosyanızdan şöyle bir sonuç alırsınız:

Warning: readfile() has been disabled for security reasons in
/docroot/betik.php on line 2

Uyarı

Şüphesiz, bu PHP kısıtlamaları çalıştırılabilir dosyalar için geçerli değildir.


Güvenli Kip
PHP Manual