Arkadaşımızın SQL injection sadece ASP için geçerli değildir. Veri tabanı ve SQL kullanan tüm web programlama dilleri için geçerlidir.
Bu açığı kapatmak için POST 'tan veya GET 'ten aldığınız bilgileri temizleyin. Nasıl mı?
Örnek PHP için:
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]
diyelim...
haberid 'yi olduğu gibi çağırırsanız SQL injection kaçınılmazdır...
<?php
$haberid = intval($_GET['haberid']);
?>
dediğinizde
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] UNION SELECT FROM bilmemne
şeklinde adresi değişseniz bile... $haberid 3 'e dönecektir.
veya...
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]
Gibi bir adresiniz içeriyor varsayalım Bu noktada SQL injection yememek için
1- Scriptinizin initialize bölümüne
Kod: Kodu kopyalamak için üzerine çift tıklayın!
<?php
/**
* @author Nickolas
* @date 12/07/2007 08:56:29
*/
function deep_addslashes($gpc)
{
if (is_array($gpc))
{
foreach ($gpc AS $var => $val)
{
if (is_array($val))
{
deep_addslashes($val);
continue;
}
$gpc["$var"] = addslashes($gpc["$var"]);
}
}
else
{
$gpc = addslashes($gpc);
}
return $gpc;
}
if (@ini_get('register_globals') AND !@ini_set('register_globals', 0))
{
trigger_error("Devam edebilmek icin <strong>php.ini</strong> dosyanizda 'register_globals' degerini 'Off' yapmalisiniz", E_USER_ERROR);
exit;
}
@ini_set('magic_quotes_sybase', 0);
@ini_set('set_magic_quotes_runtime', 0);
$gotmagic = false;
if (function_exists('get_magic_quotes_gpc') AND @get_magic_quotes_gpc())
{
$gotmagic = true;
}
if ($gotmagic == false)
{
foreach (array('_POST', '_GET', '_REQUEST', '_COOKIE') AS $GPC)
{
$GLOBALS["$GPC"] = deep_addslashes($GLOBALS["$GPC"]);
}
}
?>
Kodlarını Girin.
Bu kod...
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] OR UNION SELECT * FROM admin WHERE 'a' = 'a'
daki kodun Tek Tırnak ( ' ) karekterlerini (\') şeklinde getirecek ve SQL Injection dan kurulacaksınız...
2. İşlem
<?php
$kategori = trim($_GET['do']);
mysql_query("SELECT * FROM haber WHERE kategori = '$kategori'");
?>
şeklinde değil de...
<?php
$kategori = mysql_real_escape_string(trim($_GET['do']));
mysql_query("SELECT * FROM haber WHERE kategori = '$kategori'");
?>
Şeklinde kullanın. mysql_real_escape_string fonksonu bir nevi addslashes görevi yapar... ve ayrımlarda kullandığı Tek Tırnak karekterini operatörlükten string e indirger..