21 Şubat 2008 Perşembe

HTTP_X_FORWARDED_FOR

PHP uygulamalarında sıkça rastladığımız bir problem bu. PHP programcıları, bazı proxy'ler HTTP_X_FORWARDED_FOR içinde gerçek IP bulundurduğu için uygulamalarında IP adresini şu şekilde alıyor.

Gayet mantıklı bir kod gibi gözükmesine rağmen, $_SERVER[] süper globali içinde tutulan, HTTP_ ile başlayan tüm değişkenler kullanıcı tarafından değiştirilebilir verilerdir. Basit bir cURL isteği düşünün, eklemeniz gereken parametre şu:

curl_setopt($ch,CURLOPT_HTTPHEADER,array("X_FORWARDED_FOR: tamperdata.blogspot.com"));

Eğer bu değeri veritabanına alıyorsanız SQL Injection, ekrana basıyorsanız zararsız şekilde XSS saldırılarına yol açar.

Kısaca, hem REMOTE_ADDR, hem de X_FORWARDED_FOR loglamak en mantıklısı.

Aynı şekilde $_SERVER[] dizisi içinde bulunan, PHP_SELF, PATH_INFO, PATH_TRANSLATED gibi değişkenler de aynı durumda.

index.php/eheh gibi bir istek yaptığınızda index.php sorunsuzca açılacaktır ama değişkenler şöyle bir duruma geçer:

_SERVER["PATH_INFO"] = /eheh
_SERVER["PATH_TRANSLATED"] = /var/www/domain.tld/eheh
_SERVER["PHP_SELF"] = /index.php/eheh

URI ile oynayarak, phpinfo(); çıktısından sadece URI üstünden değişen globalleri görebilirsiniz.

( bir giriş falan yapmadan direk girdik ama, böyle oluversin. bu blogda PHP uygulaması geliştirenler için güvenlik önerileri/önlemleri ele alınacaktır.)