Alıntı
Eksik / Yanlış Bilgilendirme Görürseniz Lütfen Belirtin

PHP SQL Injection Açığı Bırakmamak İçin Dikkat Edilmesi Gereken 2 Nokta.


Evet bayanlar ve baylar, sahnede ben olmak üzere sizlerin güvenlik konusunda bilgilenmesi için bu dökümanda sql injection'a değineceğim. (accayip havali oldu )
PHP & MySQL ikilisiyle birçoğumuz içli-dışlıdır. Lâkin bu güzel uygulamalarımızda düştüğümüz (yada düştüğünüz ) güvenlik açıkları arasında
en çok yer kaplayan sql injection'dır.

[+] Escape Kullanın.
Neden escape kullanmaliyiz? çünkü bazı karakterleri olduğu gibi çalıştırırsak get veya post metoduyla beraber sql kodları çalıştırabilirler.
burdaki mantık bir önceki sorguyu tırnak isareti ile kapatmaktir.

örneğin bir admin.php sayfamız bulunsun
admin.php?yonetici=admin&sifre=12345
gibi. veya post metoduyla calissin. post'a yazarsiniz sql injection'ı. gönderirsiniz : )

SELECT * FROM yonetim WHERE yonetici='$yonetici' , sifre='$sifre'
olsun. burda adam tırnak isareti v.b. gonderebilirse nolur ?
yonetici yerine doomsday'/* yazarsa ne olur bilir misiniz?
SELECT * FROM yonetim WHERE yonetici='doomsday'/* , sifre='$sifre'
gibi olur. ve doomsday adında bir yonetici varsa (yönetici adları genelde bellidir.. admin vs..) işte direk sorgu'nun değeri 0'dan büyük olur.
sorgu olumlu sonuca ulaşmış olur. şifre sormadan direk login olmuş olursunuz : )

tabii bu benim aklimda kalan baska biryerde gördüğüm ufak bi örnekdi.. bu sekilde basit sql injection.. bu gelişebilir. direk union select kullanımı yapılıp
saldırı yapılabilir. işte bunun gibi durumlar için mutlaka mysql_real_escape_string(); fonksiyonunu eksik etmiyoruz : )
bu bizim süzgeçimiz. gelen değeri bundan geçirip gönderdiğimizde..
mesela;
admin'/*...
gibi geldi. işte süzgeçden geçince bu veri
admin\'/*
haline gelecek.


[+] ID'leri alırken tamsayı olarak alın ve tırnak işareti kullanın.

Çok fazla ayrıntıya girmiyorum, sadece korunmasını anlatıp , burda saldırı yöntemleri vermemek için.
ancak şöyle diyeyim. burdaki mantık saldırganın sorgunuzu boşa düşürmemesidir.
siz direk geleni alırsanız saldırgan arkadaşımız buraya integer olmayan bir değer verip sizin ilk select'inizi boş cevaba sürükler ve sadece peşine kendisinin
girdiği union select sonuçlarını alır.
intval(); fonksiyonunu kullanabilirsiniz.


SELECT * FROM tablo_adi WHERE id=$gelen
gibi kullanımlardan kaçının.
SELECT * FROM tablo_adi WHERE id='$gelen'
gibi olsun.

neden mi ? çünkü sorgunuzda zaten tırnak işareti yoksa; mysql_real_escape_string(); kullanmanında pek yararı olmayacaktir : )
tırnak işareti olursa saldırgan kendi sorgusunu çalıştırmadan önce sizin sorgunuzu bitirmesi gerekir. ve bir tırnak işaretine ihtiyac duyar. ancak mysql_real_escape
bu tırnak işaretini escape eder. tabi eger intval kullandiysaniz escape'e gerek yoktur.