SQL degistirme savunmasi cok kolay bir tehlikedir. Fakat bircok uygulama hala risk tasimaktadir. Asagidaki ornekte basit bir SQL sorgusu vardir.
<?php
$sql = “INSERT
INTO users (reg_username,
reg_password,
reg_email)
VALUES (’{$_POST[’reg_username’]}’,
’$reg_password’,
’{$_POST[’reg_email’]}’)”;
?>
$_POST kullaniliyor. Bu sorgunun basitce bir kullanici hesabi acma islemi oldugunu dusunelim. Kayit isleminde gecici bir sifre olusturulup kullaniciya mail atildigini dusunelim. Art niyetli bir kullanici kullanici adi yerine asagidaki metni girdiginde:
bad_guy’, ’mypass’, ’’), (’good_guy
Bu herhangi bir veri kontrolunden gecirilmediginde direk olarak SQL sorgusunda asagidaki gibi bir degisiklik olusturur:
<?php
$sql = "INSERT
INTO users (reg_username,
reg_password,
reg_email)
VALUES (’bad_guy’, ’mypass’, ’’), (’good_guy’,
’1234’,
’shiflett@php.net’)"; ?>
Bu durumda sorgu bir hesap olusturmasi gerekirken iki hesap olusturacak.
Bu ornek cok zararli gorulmeyebilir. Art niyetli kisi SQL degistirmeyi basardigi zaman yapabilecegi SQL dilinin yapabilecekleri ile sinirlidir.
Bazi veritabanlarinda ayni anda birden fazla SQL cümlesi gonderilebilir. Boyle durumlarda saldirgan gercek sorguyu sonlandirip istedigi sorguyu calistirabilir.
MySQL on tanimli olarak birden cok sorgu cumleciginin ayni anda islenmesine izin vermemektedir. Yeni sürümlerde birden fazla sorgu PHP eklentisi (ext/mysqli) mysqli_query() yerine mysqli_multi_query() kullanilarak gonderilebilir. Tek sorgu ile calisilmasi ve coklu sorgu islemeye izin verilmemesi tehlikeyi azaltir.
SQL degistirmeyi engellemek icin :
Disaridan alinan butun verileri kontrol edin.
Bu cümle tekrar edildigi kadar onemlidir. Siki bir kontrol bircok tehlikeyi baslamadan engeller.
“’” kullanin.
Eger veritabani izin veriyorsa (MySQL verir) SQL icindeki butun degerleri “’” icine alin.
cakismayi kontrol edin.
Bazen normal metinlerde SQL benzeri metin parcalari olabilir. Bu tür durumlarda veritabaninin bunu ayirt etmesi icin mysql_escape_string() yada veritabaninin sagladigi fonksiyonlari kullanilmalidir. Eger veritabani boyle bir fonksiyon saglamiyorsa addslashes() son care olarak kullanilabilir.
<?php
$sql = “INSERT
INTO users (reg_username,
reg_password,
reg_email)
VALUES (’{$_POST[’reg_username’]}’,
’$reg_password’,
’{$_POST[’reg_email’]}’)”;
?>
$_POST kullaniliyor. Bu sorgunun basitce bir kullanici hesabi acma islemi oldugunu dusunelim. Kayit isleminde gecici bir sifre olusturulup kullaniciya mail atildigini dusunelim. Art niyetli bir kullanici kullanici adi yerine asagidaki metni girdiginde:
bad_guy’, ’mypass’, ’’), (’good_guy
Bu herhangi bir veri kontrolunden gecirilmediginde direk olarak SQL sorgusunda asagidaki gibi bir degisiklik olusturur:
<?php
$sql = "INSERT
INTO users (reg_username,
reg_password,
reg_email)
VALUES (’bad_guy’, ’mypass’, ’’), (’good_guy’,
’1234’,
’shiflett@php.net’)"; ?>
Bu durumda sorgu bir hesap olusturmasi gerekirken iki hesap olusturacak.
Bu ornek cok zararli gorulmeyebilir. Art niyetli kisi SQL degistirmeyi basardigi zaman yapabilecegi SQL dilinin yapabilecekleri ile sinirlidir.
Bazi veritabanlarinda ayni anda birden fazla SQL cümlesi gonderilebilir. Boyle durumlarda saldirgan gercek sorguyu sonlandirip istedigi sorguyu calistirabilir.
MySQL on tanimli olarak birden cok sorgu cumleciginin ayni anda islenmesine izin vermemektedir. Yeni sürümlerde birden fazla sorgu PHP eklentisi (ext/mysqli) mysqli_query() yerine mysqli_multi_query() kullanilarak gonderilebilir. Tek sorgu ile calisilmasi ve coklu sorgu islemeye izin verilmemesi tehlikeyi azaltir.
SQL degistirmeyi engellemek icin :
Disaridan alinan butun verileri kontrol edin.
Bu cümle tekrar edildigi kadar onemlidir. Siki bir kontrol bircok tehlikeyi baslamadan engeller.
“’” kullanin.
Eger veritabani izin veriyorsa (MySQL verir) SQL icindeki butun degerleri “’” icine alin.
cakismayi kontrol edin.
Bazen normal metinlerde SQL benzeri metin parcalari olabilir. Bu tür durumlarda veritabaninin bunu ayirt etmesi icin mysql_escape_string() yada veritabaninin sagladigi fonksiyonlari kullanilmalidir. Eger veritabani boyle bir fonksiyon saglamiyorsa addslashes() son care olarak kullanilabilir.