lostyazilim
tr.link

PHP SQL Injection Açıklarımızı Kapatalım

9 Mesajlar 3.901 Okunma
lstbozum
tr.link

maytkambek maytkambek WM Aracı Kimlik Onayı
  • Üyelik 19.11.2011
  • Yaş/Cinsiyet 1 / E
  • Meslek öğrenci
  • Konum Almanya
  • Ad Soyad M** B**
  • Mesajlar 49
  • Beğeniler 3 / 10
  • Ticaret 0, (%0)
Genel olarak SQL Injection açıklarının ana kaynağı kontrol edilmemiş $_POST ve $_GET değerleridir.

İlk olarak bu değerlerimizi kontrol ettirelim.
Örnek $_POST kontrolü;

$verimiz = $_POST['veri'];

//Veride SQL terimleri var mı yok mu kontrolü yapan fonksiyonumuz;
function ctrl($suz) {
$sansurle = array('CREATE','DELETE','SELECT','FROM','LIMIT','TABLE');
$editle = array('---','---','---','---','---','---');
$isle = str_replace($sansurle,$editle,$suz);

$safhal = mysql_real_escape_string($isle);

return $safhal;

}

$veri[2] = ctrl($verimiz); // Kontrolden geçirdik artık işlem yapabiliriz.


Aynı şekilde $_GET'e uyarlarsak;


$verimiz = $_GET['veri'];

//Veride SQL terimleri var mı yok mu kontrolü yapan fonksiyonumuz;
function ctrl($suz) {
$sansurle = array('CREATE','DELETE','SELECT','FROM','LIMIT','TABLE');
$editle = array('---','---','---','---','---','---');
$isle = str_replace($sansurle,$editle,$suz);

$safhal = mysql_real_escape_string($isle);

return $safhal;

}

$veri[2] = ctrl($verimiz); // Kontrolden geçirdik artık işlem yapabiliriz.


$_GET ve $_POST değerlerinde sayı kontrolü;

Bu iş için intval(); kullanılabilir ama ben intval(); kullanmayı sevmiyorum. 32 bit ve 64 bit işletim sistemlerine göre alabileceği maksimum değerler değişiyor. Bazen hata verebiliyor. Bu yüzden Türk işi bir çözüm var :cool:


// Örnek $_GET

$veri = $_GET['sayi']+0;

// Örnek $_POST

$veri = $_POST['sayi']+0;


Gelen sayıyı sıfırla topladığımızda hiçbir şey değişmiyor ancak gelen bir harf, kelime, vs. olsaydı değer otomatik olarak "0" olacaktı.
bd ByCookie

kişi bu mesajı beğendi.

wmaraci
reklam

Omercitak Omercitak Sms Onayı Gerekli Banlı Kullanıcı
  • Üyelik 01.08.2012
  • Yaş/Cinsiyet 30 / E
  • Meslek Öğrenci / Php Developer
  • Konum Yalova
  • Ad Soyad ** **
  • Mesajlar 174
  • Beğeniler 64 / 45
  • Ticaret 1, (%100)
Birşeyler anlatmaya çalışmışsın emeğine sağlık ama yanlış anlatmışsın :) Kesinlikle yanlış bir anlatım. Senin yazdığın bu fonksiyon; belirlediğin kelimeleri gelen verileri içinden süzüyor. Yanlış çünkü;

1- Kelime engelleme rahatça bypass ediliyor
2- Kullanıcının masumca gönderdiği bi mesejın içinde bu kelimeler varsa silip karşı tarafa iletecek. Farzımisal bi hosting firmasının; üyen sana "select delete çalışmıyor lütfen yardım edin" diye mesaj gönderemeyecek.

Yanlış anlaşılma olmasın; amacım karalamak değil. Yanlış bilgilendirmeden korumak. SQL Injection hakında temel olarak nasıl koruma sağlayacığını bu konuda anlatmıştım : http://wmaraci.com/forum/php/sql-injection-saldirilari-korunma-yontemleri-112621.html
 

 

soulmy soulmy WM Aracı Kullanıcı
  • Üyelik 12.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Öğretmen
  • Konum Samsun
  • Ad Soyad O** Y**
  • Mesajlar 1722
  • Beğeniler 398 / 400
  • Ticaret 20, (%100)
Çok uğraşmışsın, sadece şu 2 satırlık kod yetiyor bile :D

$_GET = array_map('mysql_real_escape_string',$_GET);
$_POST = array_map('mysql_real_escape_string',$_POST);


Kaynak: http://soulmy.net/array_map-ile-bir-diziye-birden-fazla-fonksiyon-uygulama/

Edit: Bu arada PDO prepare ile bunu yapmaya da gerek kalmıyor.
 

 

.

Omercitak Omercitak Sms Onayı Gerekli Banlı Kullanıcı
  • Üyelik 01.08.2012
  • Yaş/Cinsiyet 30 / E
  • Meslek Öğrenci / Php Developer
  • Konum Yalova
  • Ad Soyad ** **
  • Mesajlar 174
  • Beğeniler 64 / 45
  • Ticaret 1, (%100)

soulmy adlı üyeden alıntı

Çok uğraşmışsın, sadece şu 2 satırlık kod yetiyor bile :D

$_GET = array_map('mysql_real_escape_string',$_GET);
$_POST = array_map('mysql_real_escape_string',$_POST);


Kaynak: http://soulmy.net/array_map-ile-bir-diziye-birden-fazla-fonksiyon-uygulama/

Edit: Bu arada PDO prepare ile bunu yapmaya da gerek kalmıyor.


Hiçbirzaman sadece mysql_real_Escape_string yeterli olacak diye bir kadide yok. Bu 2 satır tam koruma sağlamaz
 

 

wmaraci
wmaraci

soulmy soulmy WM Aracı Kullanıcı
  • Üyelik 12.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Öğretmen
  • Konum Samsun
  • Ad Soyad O** Y**
  • Mesajlar 1722
  • Beğeniler 398 / 400
  • Ticaret 20, (%100)

Ömer Çıtak adlı üyeden alıntı

Hiçbirzaman sadece mysql_real_Escape_string yeterli olacak diye bir kadide yok. Bu 2 satır tam koruma sağlamaz


SQL Injection açığı için başka daha ne yapmak gerekiyor? Söyleyin de biz de bilelim.
 

 

.

ElseIf ElseIf Yazılım Geliştiricisi Kullanıcı
  • Üyelik 04.01.2014
  • Yaş/Cinsiyet 34 / E
  • Meslek Bilgisayar Programcısı
  • Konum Sakarya
  • Ad Soyad M** E**
  • Mesajlar 58
  • Beğeniler 1 / 7
  • Ticaret 0, (%0)
Emeğine sağlık kardeşim. Fakat bunlar tam koruma sağlamaz her bir "php" uygulamaları için tam koruma lazım ki bu çok zordur.
 

 

Omercitak Omercitak Sms Onayı Gerekli Banlı Kullanıcı
  • Üyelik 01.08.2012
  • Yaş/Cinsiyet 30 / E
  • Meslek Öğrenci / Php Developer
  • Konum Yalova
  • Ad Soyad ** **
  • Mesajlar 174
  • Beğeniler 64 / 45
  • Ticaret 1, (%100)

soulmy adlı üyeden alıntı

SQL Injection açığı için başka daha ne yapmak gerekiyor? Söyleyin de biz de bilelim.


Bu konu altındaki ilk yorumumda söylemiştim. Buyur : http://wmaraci.com/forum/696337-mesaj2.html
 

 

soulmy soulmy WM Aracı Kullanıcı
  • Üyelik 12.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Öğretmen
  • Konum Samsun
  • Ad Soyad O** Y**
  • Mesajlar 1722
  • Beğeniler 398 / 400
  • Ticaret 20, (%100)

Ömer Çıtak adlı üyeden alıntı

Bu konu altındaki ilk yorumumda söylemiştim. Buyur : http://wmaraci.com/forum/696337-mesaj2.html


Siz ne yapılmaması gerektiğini söylemişsiniz, ne yapılması gerektiğini söylememişsinizki. :confused:

Videodan bahsediyorsanız, internetim kotalı ne yazıkki. İzlemem mümkün değil.
 

 

.

Omercitak Omercitak Sms Onayı Gerekli Banlı Kullanıcı
  • Üyelik 01.08.2012
  • Yaş/Cinsiyet 30 / E
  • Meslek Öğrenci / Php Developer
  • Konum Yalova
  • Ad Soyad ** **
  • Mesajlar 174
  • Beğeniler 64 / 45
  • Ticaret 1, (%100)
Videoyu kastetmiştim; videoda anlatmıştım. Nasip değilmiş :/
 

 

Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al