MySQL / mysql_real_escape_string komutu
mysql_real_escape_string komutu
|
 |
Yazar: FERDIKUCUK
Eklenme:
10/03/08
Okunma:
217 |
|
|
| |
| |
|
|
Terim gereği bir tanımlama yapmakta fayda var;mysql_real_escape_string,bir sql ifadesinde;sql için özel anlam ifade edebilecek terimleri escape (kaçış) etmeye yaramaktadır,bir başka deyişle backslashes(\) etmektedir.Peki neden kullanılır?bilmeyenleriniz olabilir.Tabi ki deminde söylediğim gibi,sql de özel anlam ifade eden,terimlerden en önemlisi (') tek tırnak işaretidir.sql sorgularında genelde kayıt problemlerinde ve sql injection ataklarında (adres acığından sızma yöntemi) bu tırnak işaretleri,Programcının başını ağrıtan en önemli karakterlerden bir tanesidir,En basit ve akılda kalıcı bir yöntemle örnek vermem gerekirse;
PHP Kodu:
Kod Çizelgesi Kod Dili: php
$veri_kaydi="insert into tablo values ('',''blahblah''.....);
Gibi bir verikaydı hatalı bir verikaydıdır,cunku sql ifadesinde zaten kayıt işlemlerinde,sql için özel anlam ifade eden bir terimi veri kaydederken de kullanmış olmaktayız,bu karakterde söylediğimiz gibi (') tek tırnaktır,işte form yardımıyla ziyaretçiden gelen bilgileri,mysql_real_escape_string sayesinde backslashes etmek gerekmektedir,Sql injection saldırılarında bu açıktan faydalanarak sistem hackleri gerçekleşmektedir.Bildiğiniz gibi ziyaretçiden gelen $_POST['adi'] gibi bir değişken,gerçekten çok tehlikeli bir değişkendir.Bu değişkenden gelen verilerde gerekli süzmeleri yapmadığımız sürece,sistemimize canavar kaydettiğimizi bilmemiz gerekmektedir.İşte bu yüzden mysql_real_escape_string fonksiyonu bo önlemleri bize almamızda bize yardımcı olacaktır.
Şimdi birazcık daha olayı özleştirmek gerekirse;mysql_real_escape_string fonksiyonunu nasıl kullanıcaz,örnekler üzerinde göstererek anlamaya çalışalım,zira örnekler üzerinde gösterilen kodlamalar ve anlatımlar,amatör programcıların kafalarında daha kalıcı bir etki yaratacıgından eminim.Şimdi o zaman bir form aklınıza getirin.
PHP Kodu:
Kod Çizelgesi Kod Dili: html
<form action="" method="post">
<input type="text" name="adi" >
<input type="submit" name="kaydet" value="kaydet">
</form>
Şimdi bu basit ve masum görünen form aslında,önlemini almadıgınız sürece gercekten bir canavar kesilir ve başınıza büyük bir bela almanıza sebebiyet verir.O yüzden bu formdan şu an itibariyle korkmamız lazım.Zira kaydet butonunla gelen hiç bir bilgiyi bilmiyoruz.Ne yollandığı hakkında en ufacık bir bilgimiz bile yok.Her ne yollandıysa yollansın numeric yada text hiç farketmez,sql için özel anlam ifade edebilecek terimler varsa içinde onları temizletip,gelen post bilgiyi,güvenlik moduna alabiliriz.İşte bunun için aşağıdaki kodlamayla bu formu masum haline getireceğiz.
PHP Kodu:
Kod Çizelgesi Kod Dili: php
/* mysql bağlantısını yazıyoru */
mysql_connect ("hostname","username","password") || die ("false1");
mysql_select_name ("database") || die ("false2");
/* gelen bilgiyi süzüyoruz */
$adi=mysql_real_escape_string($_POST['adi']);
$veri_kaydi="insert into tablo values ('','$adi');
$sorgu=mysql_query($veri_kaydi);
if(isset($sorgu) ) {
echo 'true';
}
else {
echo 'false';
}
Gördüğünüz gibi, $adi=mysql_real_escape_string($_POST['adi']); yazdıgımız bu değişkende bilgi süzmesi yaparak,eğer yollanan post bilgide,tehlikeli sql için anlam ifade edebilecek terimler varsa,bunlara backslashes yapıp tehlikeli modundan cıkarıyoruz,ve yorumlanır moda sokuyoruz.İşte bu yontemle ifadeyi ele alıp,gerekli önlemleri almış bulunmaktayız.Tabi cok guvenilir yani %100 güvenilir bir fonksiyon mu; hayır asla değil,cunku 100 lerce komplike durumlar söz konusu olunca,elde edilen bilgi ve önlemlerimiz,hiç bir kodun %100 saglıklı oldugunu acıklamayacaktır.Genel manada önlemlerinizi bu şekilde almış bulunuyoruz.
Aslında mysql_real_escape_string den farklı olarak,bazı kişiler,stripslashes ve addslashes fonksiyonlarını kullanarak,kayıt yaptıklarını görüyorum,yararlı olsalar bile,aslında hiç güvenilir olmayan 2 fonksiyonu kullanmış oluyorsunuz.mesela stripslashes fonksiyonunu şu şekilde kullanmak,gerçekten tek bir şart için süzme yaparsınız,ama o şartı bilen biri size hiç farkettirmeden escape yaptırırsa,sql icin özel anlam ifaden ifadelerin escape ini size kaldırmış olur.Ne demek istediğimi aşağıdaki kodla anlamaya çalışalım.
PHP Kodu:
Kod Çizelgesi Kod Dili: php
$_POST['adi']="\'x";
$adi=stripslashes($_POST['adi']);
Bu kodla kayıt yaparsanız,('x) su ifadeyi sisteminize almış olursunuz,cunku ziyaretci boyle bir bilgiyi yani \'x su ifadeyi yollayarak sizden backslashes (\) ı kaldırmanızı ister ve sizde kaldırırsınız.o yüzden stripslashes komutuyla kayıt yapılmaz.Şimdi o zaman gelin en sağlıklı kayıt biçimini manual destekli göstererek konuyu bitireyim.
PHP Kodu:
Kod Çizelgesi Kod Dili: php
if(get_magic_quotes_gpc()) {
$adi=stripslashes($_POST['adi']);
echo $adi;
}
else {
$adi=$_POST['adi'];
}
$query = sprintf("INSERT INTO tablo (adi) VALUES ('%s')",
mysql_real_escape_string($adi, $link);
Burada daha guvenli olarak,configurasyon ayarlarından get_magic_quotes_gpc ayarlarını kontrol ettiriyoruz,eğer if şartında ki gibi ayar 0 ise; stripslashes ile backslashes (\) karakterlerini tehlikeli komuttan cıkartıyoruz eğer ayar on ise; stripslashes kullanmamıza gerek yok,cunku karakterleri zaten mysql_real_escape_string escapeliyecektir.
mysql_real_escape_string komutunla ilgili son olarak soyleyeceğim kelimeler; bu komut % and _. bu gibi karakterlere karsı etkisizdir,yani bu ifadeleri escapelemez,zira en tehlikeli olan tek tırnak ta escapeleme yapması,sql icin baz alınabilecek saldırıları yok etmesi,birinci derecede etki yapabilecek bir önlemdir.
Makale Sahibi : Ali Gürbüz
Not : Her Makalesinde Oldugu Gibi Bu Makalesinde de Kendisine tesekkur Ederim.
|
| |
|