pillinetwork hesabınızla giriş yapın.

Sql İnjectiona Ufak Bir önlem

Merhabalar SQL İnjection Atakları Webmasterların En Nefret Ettikleri Olaylardan Biridir O kadar ugraşıyoruz ve dengesizin teki geliyor ve sitemizi indexliyor bizde bu basit kodcuk ile bu olayı engellemiş oluyoruz

genellikle $_POST $_GET alımalarında filitre uygulamadıgımız zaman heykır abimiz veritabanına ulaşabiliyor ve bir script yazarken en sıkıldıgım adım kendi adıma $_POST yada $_GET ile veri çekilen alandır ve bunu htmlspecialchars ile temizlektir neyse fazla uzatmıyayım kodu vereyim..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function GelenVeri($q){
$ara = array("select","union",);
$degis= array("*","*");
$q = str_replace($ara,$degis,$q);
$q = htmlspecialchars($q);
return $q;
}
function Post($q)
{
$q = GelenVeri($_POST["$q"]);
return $q;
}
function Get($q)
{
$q = GelenVeri($_GET["$q"]);
return $q;
}

kullanımı Post("Uye");
İd Alımı Get("id");

kolay gelsin

/* */
/* loverz yazdı. 17 Haziran 2009 10:46. 20 yorum var */

Yorumlar

muhammed, ileti onaylanmış...

güzel bir mantık, lakin konunun tartışılmasında yarar görüyorum...

bilenlerden yorum bekliyorum... çünkü bu kodu aktif çalışan bir sisteme dahil etmeyi planlıyorum...

sabri ünal

/* kitaphaber, kitap ve eleştiri kaynağınız. */

php.ini de magic_quotes_gpc OFF durumunda ise hem POST hem de GET ile sql injecktiona maruz kalabilirsiniz :)

addslashes ve mysql_real_escape_string veride " veya ' varsa escape etcektir yoksa ne etcek ?

örneğin id alımlarında verinin tipini kontrol etmemişsiniz integer mi değil mi diye bu bile bir açığınızdır.

örneğin;

şöyle bir sql cümlemiz olsun.

SELECT * FROM haberler WHERE id=GET("id")

ilk başta çok masum duruyor değil mi ?

GET den gelen ID değeri ise şu şekilde olsun.

1+UNION+SELECT+user,pass,1,2+FROM+admin+WHERE+id=1

Otomatikmen sorgumuz şöyle değişecek.

SELECT * FROM haberler WHERE id=1 UNION SELECT user,pass,1,2 FROM admin WHERE id=1

ne oldu yaptığın güvenlik hiç bi işe yaramamış oldu...

@RaidenCeviz: Böyle iddiacı yorumlardan kaçınmak lazım, bilmiyorsak bildiğim kadarıyla demek lazım, çünkü burada senin bu yorumunu görenler yanlış bilgi edinecekler.

SELECT * FROM haberler WHERE id=GET("id")

şeklinde kullanamayacağın için tüm yorumunu çöpe atabilirsin, doğrusu;

SELECT * FROM haberler WHERE id='".GET("id")."'

olduğuna göre senin union selectin bir işe yaramaz. Ayrıca, mysql için kullanmak üzere "type casting" yapmaya gerek yoktur, misal "1" sayısı integerda olsa string de olsa veritabanı alanının özelliği ne ise ona göre şekil alır, unutmayalım ki (') kullandığımız her değer bizim açımızdan sadece ve sadece "string" tir.

O yüzden bu arkadaşımızın yazığı makale her ne kadar eksik olsa da senin yanlış bilgilerinden daha doğrudur.

Yazının eksiğine gelirsek;
addslashes veya htmlspecialchars kullanmak verinin orjinalini bozar ve iki kere kaçmaya yola açtığı için bazı durumlarda kaş yapayım derken göz çıkartır. (\'deneme olması gerekirken \\'deneme olur ki ilk slash ikincisini götürür ve koruma ortadan kalkar.) Sadece mysql_real_escape_string kullanmak yeterlidir. Ancak bu fonksyionu kullanmadan önce mysql bağlantısını yapmış olmak gerekir, yoksa gene bir işe yaramaz.

@mow
doğru sölüyorsun bildiğin kadar konuşmak gerekir ki bana sarfettiğin bu cümleyi ne yazık ki sen kendine pay çıkarıp kullanmıyorsun.

Şimdi test etmeden sallamadan laf olsun torba dolsun diye konuşmak yerine örneği incele ondan sonra konuş ve sonra benim yanlış bilgi verip vermediğim kanısına var ve konuş.

Pekala Herkes

SELECT * FROM tablo WHERE id='1'

Şeklinde kullancak diye kural kaide yok. Bir Çok Programıcı Bunu

SELECT * FROM tablo WHERE id=1 yada 1 yerine $_GET['id'] olarak kullanmakta.

Ben de hal böyle olunca kişinin o yazdığı fonksiyonlar hiç bir işe yaramayacak diyorum bunun neresini anlayamıyorsun ?

Bu şekilde çok açık bulmuş ve bildirim yapmışımdır veya scriptler inceleyip açıklarını bulup scripti yazan kişilere açıklarını bildirmişimdir.

Hatta sana kapak olması aaçısından 3 tane link vericem ve tıklayarak sırayla nasıl SQL INJECTION olduğunu görürsün ve susar oturursun.

Birinci Linkde Çok Masum bir ID değeri gönderilerek Haber başlığı ve içeriği çekiliyor.

http://www.ysfkc.com/dosyalar/sqlInjection.php?id=2

İkinci Linkte İse ID değerine ek yapılarak UNION ekleniyor ve Admin Tablosundan user ve pass bilgileri çekilmek isteniyor.

http://www.ysfkc.com/dosyalar/sqlInjection.php?id=2+UNION+ALL+SELECT+user,pass+FROM+admin+WHERE+id=1

Üçüncü Link İse sqlInjection.php nin source ünü gösteriyor.
http://www.ysfkc.com/dosyalar/sqlInjection.php?Show

Sadede gelecek olursak Mow önce sen yanlış bilgilerini düzelt öyle gel konuş ve yorumunu yap.

teşekkürler yusuf, muhammed ve diğer kardeşim.

aslında böylesi bir kodu yazdırmak tembelliğimizden dolayı ortaya çıktı...

get_id
get_st

post_id
post_st

gibi yazacağımız 4 fonksiyon ile $_GET ve $_POST değeri ile alacağımız değerleri kendi fonksiyonlarımız ile alarak daha güvenli ve sağlam bir süzme sistemi /veya ön veri süzme mi desek / yapmaya çalışıyoruz...

http://www.ysfkc.com/php/script-kodlarken-guvenlik-onlemleri.html makalesini örnek alaras sorarsam, bu durumda fonksiyonların doğru şekli nasıl olmalıdır?

/* kitaphaber, kitap ve eleştiri kaynağınız. */

bu tarz durumlarda sql cümlelerini replace etmek olur. Millet sanıyor ki addslashes veya mysql_real_escape_string kullandık mı tamam bitti sql injectionlardan kurtulduğunu sanmaktalar. Halbuki bu fonksiyonlar sadece string de \ veya " veya ' varsa escape etmekte yoksa neyi escape etcek ? nitekim örnek olarakda gösterdiğim gibi hiç bir işe yaramakta...

yada şöyle

function temizle($q){
$ara = array("select","union");
$degis= array("*","*");
$q = str_replace($ara,$degis,$q);
return $q;
}

ve raiden bu kadar aptalca yazı yazacagına bir çözüm önersen daha mantıklı olmazmıydı ama mantık senden ne kadar uzakta olsa bile.

/* KİWİ! */

@loverz, neden bu kadar agresifsin? Belli ki @RaidenCeviz'in anlatmak istediğini anlayamamışsın. Çözüm önerin varsa yaz konu dağılmasın, yoksa sus ortam gerilmesin...

çözüm önerimi yazdım sizin bu kadar agrasif ve bir hatada böyle yapmanızı anlamış degilim

/* KİWİ! */

@loverz
sende anlasan ne anlamasan ne çok da umrumdasın sanki bir de sana laf anlatmaya çalışayım ? Ben aptalca yazı yazmışım kimene yazmamışım kime ne ? Almak isteyen alır almak istemeyen sen gibi öter durur..

Biraz daha sakin arkadaşlar. Böyle bir yere varamayız...
Konu güzel, yorumla yapılan ek konuyu daha da güzelleştiriyor ama tartışmanın seyrinin değişmesi hepsini gölgede bırakıyor.

Evet ortamın gerginliği yazılımcı olmaktan kaynaklanıyor tabii ki =)... BUnun yerine şöyle bir öneri sunayım; kavga eden arkadaşlar sitelerinizin linklerini verin saldırsınlar bakalım ?

Benim önerim hazır sistemlere bir bakın, örneğin Wordpress veya PhpBB gibi sistemlerin güvenliklerine bir bakın. Ben burdan direk vermiyorum çünkü orda başka öğrenebileceğiniz ve/veya bilip aklınıza gelebilecek mantıkları hatırlayabilir/öğrenebilirsiniz.

İyi çalışmalar, bol kodlu gece-gündüzler =)))

Hmm anladım, @raiden: sanırım senin önce söz dizimini öğrenmen gerekli. Olabilir, yeni başlayan herkes senin yaptığın hataları yapabilir bunda üzülecek kızarıp bozarılacak bir durum yok, yeter ki bu b.ktan yarım yamalak anladığına inanmış ol. Ayrıca senden bile kötü kod yazan insanlar olabilir, bunları bulunca maalesef yetkin olmuyorsun.

Eğer tek tırnak nedir çift turnak nedir, hangisinde değişken müdahalesiz çalışır bilmiyorsa adam, zaten ona yapacak bir şey yok demektir ve elbette bu arkadaşımızın yazdığı şey de işe yaramaz. Bir çok gerizekalı öyle kullanıyor diye öyle kullanmayanların işine yarayabilecek bir önermeyi senin yaptığın gibi değersiz göstermek doğru değildir. "Arkadaşlar bunun çalışması için şunu şöyle yapmak lazım" dersin olur geçer, kökünden kötülemezsin.

Yazdıklarının %90'ı yanlış ne yapayım doğru mu diyeyim? Her neyse, sen kişisel olarak yazara sataştığından ben de sana kişisel olarak hitap ettim, eleştirirken daha usturuplu olmanı dilerim. Böyle gereksiz gerginlikler yaşamayız.

@Dillian güzel bir noktaya değinmiş. WP, Drupal gibi sistemler neler yapıyor bu konuda? Formdan, adres satırından, metin editöründen sürüsüyle veri alıyorlar. Aldıkları çoğu veri işleniyor, içindekilerden eklentiler faydalanıyor. Mesela WP'nin bu konuda uyguladığı adımların bir diyagramı var mıdır? (Bir yerde WP'nin çalışma ilkesini içeren kocaman bir kopya kağıdı görmüştüm ama)

/* Kaza yerine ulaştınız, ilk ne yapmalısınız?Peki bununla beraber ilkyardımla nasıl hayat kurtarabileceğinizi biliyor musunuz? */

olay şudur kanaatimce, ben bunu kullanırım daha da aşıldığını görmedim

mysql_query(vsprintf("select * from tblo where string_deger = '%s' and int_deger=%d",
array(
mysql_real_escape_string($_POST['veri']); //stringi direk basalm
floatval($_POST['id']); //int olduğundan
)
));

bence oldukça güvenli.. tabii açıklar olabilir mi bunu daha uzman arkadaşlar bilecektir.

/* i, dev. */

işte ysfkc unda dedigi bu real_escape string sadece tırnakların önüne slah atıyor.

/* KİWİ! */
örneğin;

şöyle bir sql cümlemiz olsun.

SELECT * FROM haberler WHERE id=GET("id")

ilk başta çok masum duruyor değil mi ?

GET den gelen ID değeri ise şu şekilde olsun.

1+UNION+SELECT+user,pass,1,2+FROM+admin+WHERE+id=1

Otomatikmen sorgumuz şöyle değişecek.

SELECT * FROM haberler WHERE id=1 UNION SELECT user,pass,1,2 FROM admin WHERE id=1

ne oldu yaptığın güvenlik hiç bi işe yaramamış oldu...

Öncelikle amacım tartışmak değil ama yukarıdaki sql cümlesinde arkadaşın vermiş olduğu Get ve Post fonksiyonları kullanıldığı zaman;
1+UNION+SELECT+user,pass,1,2+FROM+admin+WHERE+id=1
olarak belirtmiş olduğum sql cümlesi;
1+*+*+user,pass,1,2+FROM+admin+WHERE+id=1
şekline dönmez mi?

@ZeuQma: Evet ama bütün sql sözdizimini "$ara" içine yazmak gerekir, manasız olur.

@raiden: cahille sohbeti kestim.
@dillian: yürrü beee, yorumda son nokta helal...

@mow ister kes ister kesme umrumda mısın ? sen field='value' kullanıyosan field=value kullanan da bir çok kişi var otur scriptleri incele ondan sonra yorum yap bodoslama dalma yok söz dizimi yok bilmem ne yok şu yok bu...

@RaidenCeviz, agresifleşmeyelim sonuçta burda efendi efendi tartışıyoruz birşeyleri kavga etmiyoruz. Ha stres atmak isterseniz Powerball alın =)

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.

pilliilan

son yorumlar

arama

pillinetwork