IP Loglama Genel Bir Hata

19.10.2007

Okuyucu : 1.170
Günlük Okuyucu : 5,5

Özellikle kaynak kod analizleri yaparken sık sık rastladığım hatalardan biri bu.

Güvenlik veya herhangi bir nedenden dolayı uygulamada IP adreslerini loglamak istiyorsunuz ancak potansiyel proxy adreslerini de loglayabilmek için HTTP_X_FORWARDED_FOR HTTP Header' ını da (veya benzer başka HTTP headerları) kullanıyorsunuz.

Bu güzel bir fikir çünkü bazı proxyler ziyaretçinin gerçek IP adresini bu HTTP Header(ları) içerisinde gönderiyorlar ama bu işlem yapılırken uygulanan çok yanlış bir model var.

Sık şekilde şu kod ile karşılışıyorum :

  1. IPADDRESS adresi değişkenini tanımla,
  2. HTTP_X_FORWARDED_FOR HTTP header' ı varsa IPADDRESS değişkenini HTTP_X_FORWARDED_FOR değerine eşitle
  3. Yoksa IPADDRESS değişkenini ziyaretçinin normal IP adresine eşitle.
  4. IPADDRESS' ini veritabanına vs. kaydet.

Sanırım herkes sorunu anladı bile. Normal bir ziyaretçi olarak server' a kıçınızdan uydurduğunuz IP adreslerini HTTP_X_FORWARDED_FOR HTTP Header' ı içerisinde gönderebilir ve gerçek IP adresinizin loglanmasını engelleyebilirsiniz.

Bazı programcılar bu datanın her zaman geçerli IP adresi döndüreceğini düşünüp bu datayı veritabanına gönderirken filtreleme / kontrol yapmayı da ihmal edebilirler. Tabii ki bu da SQL Injection açığına neden olabilir.

Yorumlar

RSS Bu makalenin yorumlarını RSS ile takip et!

çok güzel bir genel açik. tebrikler ....

masterfake [ # | 19.10.2007 ]

Peki proxy kullanildiginda IP adresini almanin en saglikli yolu nedir?

HTTP_X_FORWARDED_FOR basligini hiç kullanmamak mi?

Yoksa bu basliktan gelen verinin gerçekten bir IP adresi olup olmadigini kontrol etmek mi?

grz [ # | 19.10.2007 ]

Peki proxy kullanildiginda IP adresini almanin en saglikli yolu nedir?

Onu neden yazmamisim bilmiyorum, basit sekilde hepsini kaydetmek. Dolayisiyla hem orijinal baglanti IP adresini hem de basliklarda gelen potansiyel IP adreslerini.

Ferruh Mavituna [ # | 19.10.2007 ]

Söyle olur mu acaba;

Mail gönderirken;

} else {
if (isSet($_SERVER)) {
if (isSet($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isSet($_SERVER['HTTP_CLIENT_IP'])) {
$realip = $_SERVER['HTTP_CLIENT_IP'];
} else {
$realip = $_SERVER['REMOTE_ADDR'];

Koray YAMAn [ # | 21.10.2007 ]

merak ettigim su, 'HTTP_X_FORWARDED_FOR' için istedigimizi gönderebiliyorsak "ip adresinix 900.90..." :) diye yazan sitelerde xss denenebilir mi ?

sinan [ # | 23.10.2007 ]

Spoofingten mi bahsediyorsunuz :)

Koray YAMAN [ # | 23.10.2007 ]

if (isSet($_SERVER)) {
if (isSet($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isSet($_SERVER['HTTP_CLIENT_IP'])) {
$realip = $_SERVER['HTTP_CLIENT_IP'];
} else {
$realip = $_SERVER['REMOTE_ADDR'];


Bu tam olarak hatali oldugunu soyledigim koda bir ornek. Ozetle hepsini yani tum headerlari loglamak en temizi.


merak ettigim su, 'HTTP_X_FORWARDED_FOR' için istedigimizi gönderebiliyorsak "ip adresinix 900.90..." :) diye yazan sitelerde xss denenebilir mi ?

:) Bu guzel bir soru. Cevap hem evet hem hayir. Normalde hayir yapmayiz cunku browser'i belli bir HTTP_HEADER yollamaya zorlayamayiz. Cunku XSS te baskasinin browserina bu HTTP_HEADER i gondertmeniz lazim.

Ama Evet cunku Flash gibi bazi 3rd party yazilimlar bu tip seylere izin veriyor. Sanirim Flash in son versiyonunda bu acik giderildim ama potansiyel olarak benzer durumlari gene gorebiliriz.

Ferruh Mavituna [ # | 23.10.2007 ]

Bu isleme benzer bir islemde browser engellemeleri için geçerli user-agent degeri kullanilarak browserin siteyi görüntüleyip,görüntülememesi,user-agent degeri degismeyecek birseymis gibi :P ben çok seviyorum user-agent'le ugrasmayi mesela 4ever Firefox :D

TunerX [ # | 26.10.2007 ]

Merhaba ferruh;

Ben kendi kisisel sitemi kodlarken yazilarima yazilan yorumlarda IP logu tutuyorum..
IP logu tutarken hiç bir sekilde sql injenction korumasindan geçirmeden direk veritabanina insert ediyorum..
C# ile IP adresini Request.ServerVariables["REMOTE_ADDR"] komutuyla direk aliyorum..

Herhangi bir dilde browser gelistirilerek veya piyasada bulunan browserlar ile bu aldigim ip adresine farkli (') gibi kodlar gömebilirler mi =?
Kolay gelsin..

Ekrem ÇAKMAK [ # | 30 gün, 34 dk ]

Herhangi bir dilde browser gelistirilerek veya piyasada bulunan browserlar ile bu aldigim ip adresine farkli (') gibi kodlar gömebilirler mi =?
Normalde gomulemez ama sorun su ki server-side dillerde de sorun cikabiliyor. Mesela REMOTE_ADDR yerine REMOTE-ADDR headeri gonderince sistem bunu alabiliyor vs.

Saglikli yolu kesinlikle SQL Injection yolunun alinmasi. Onun da en saglikli yolu parameterized query ler olusturulmasi. Hem pratik hem de cok daha temiz ve guvenli.

Ferruh Mavituna [ # | 30 gün, 35 dk ]

Yorum Ekle





Kullanılabilir Taglar : [<blockquote>] [<strong>] [<em>]

IP Loglama Genel Bir Hata ile İlişkili Olabilecek Yazılar - Haberler

SSL Implementation Security FAQ
Devlet Sistemlerinin Güvenliği
SQL Tunnelling - Exploiting Internal Networks via SQL Injection
Subsonic PageIndex Problemi ve DoS
Türkçe SQL Injection Referansı

Diğer Yazılar

Neredeyim ?

Ferruh.Mavituna » Haberler » IP Loglama Genel Bir Hata

Ferruh Mavituna
© 2002-2007, Ferruh Mavituna

Sabit IP Adresi : 81.22.99.133, SSL Erişimi, Hakkında