S.A. Arkadaşlar,
PHP'ye yeni başladım. Sıfırdan sayfalar kodluyorum ama acaba kodladığım sayfalarda SQL açığı oluşuyor mu bunu nasıl kontrol edebilirim? Nelere dikkat etmem gerekli?
Bir de genel olarak nelere dikkat etmeliyim güvenlikle alakalı olarak?
Şimdiden teşekkürler...
SQL Injection Bulma ve Kapatma
9
●5.830
- 11-09-2012, 22:10:17
- 11-09-2012, 22:34:08Kimlik doğrulama veya yönetimden onay bekliyor.R10 patlamadan önce bir yazı yazmıştım bununla ilgili. Klasik olarak Google'a sql injection yazıp aratsan milyonlarca örnek ve çözüm bulabilirdin demek istiyorum. Bu çok klasik ve kolayına kaçmak gibi görünse de doğrusu bu.
Neyse konuya dönelim.
SQL Injection, daha çok veritabanı sorgularıyla ilgili bir açık. Fazla konuşmadan örnek vereyim.
Mesela kodların/sorgun şu şekilde:
$id = $_GET['id']; mysql_query("SELECT * FROM kullanicilar WHERE id='$id'");Eğer get ile aldığın veriyi direkt olarak sorgunun içine dahil edersen neler olacak şimdi görelim.
Diyelim ki id değeri 10
mysql_query("SELECT * FROM kullanicilar WHERE id='10'");Sorunsuz bir sorgu oldu. Ama diyelim ki get ile aldığımız veri 10' olarak gönderilmiş. Bu kez ne olacak?
mysql_query("SELECT * FROM kullanicilar WHERE id='10''");Sorun oluşacak. Bu şekilde sitenize saldıranlar çeşitli saldırılar yapabilecekler. Bu açığı kapatmanız lazım. Çok şey yapmanıza gerek yok. Bunu kapatmak için tek yapmanız gereken şu. " ve ' işaretlerini süzmek. İster toptan yokedin bunları isterseniz de başka değerlere çevirin. Ama sözkonusu mysql sorgusu olduğuna göre mysql connect kullanmışsınızdır. Bu durumda mysql_real_escape_string fonksiyonu bulunmaz nimet. Tek yapacağınız şu.
$id = mysql_real_escape_string($_GET['id']);
Böylece mysql sorgularına aykırı olabilecek her türlü girdi süzülecek, düzenlenecek ve $id değişkenine öyle atanacak. Sorun ortadan kalktı.
Tam olarak SQL Injection olmasa da benzer bazı zararlı durumlar da var. Örneğin id değeri sadece sayı olacaksa (integer) kontrol etmeniz gerekir.
$id = $_GET['id']; if(!is_int($id)){ //integer değilse bunu yap } else{ //integersa bunu yap }Artık o istediğin tür neyse bunu kendine göre değiştireceksin. Vs. Vs.
Birşey daha. Google'a R10'a veya herhangi bir ilgili internet sitesinin arama bölümüne php güvenlik açıkları vs gibi bir sorgu gönderirsen inanki çok detaylı kaynaklar bulabilirsin. Yoksa kapris çekersin çok.
Aklına takılanı sorabilirsin. - 12-09-2012, 02:23:22Üyeliği durdurulduSite içindeki tüm URL'leri çekip tüm GET işlemi yapılan URL'lerin sonuna ' ekleyen ve hata kontrol eden bir PHP yada program yazılabilir. Acunetixi bilmiyorum ama büyük ihtimalle bu dediğimi yapıyordur.
ps. Açıkları kapatmak için ise arkadaşın dediği gibi mysql_real_escape_string kullanmalısınız. - 12-09-2012, 03:28:33Üyeliği durduruldu
- 12-09-2012, 12:46:21Acunetix ile siteyi tarattım, 1 tane SQL Injection buldu

O da kullanıcıdan telefon numarası girmenisi istediğim bir alan var buraya sadece sayı girişine izin vermem lazım ama harf fln da girebiliyor kullanıcı.
Bunu nasıl yapabilirim?
<?php $OgrNo=$_SESSION['OgrNo']; $GSMNo=$_GET['GSMNo']; if (isset($GSMNo)) { $sorgu="UPDATE user SET CepTelNo='$GSMNo' WHERE OgrNo='$OgrNo'"; $sonuc=mysql_query($sorgu); header('Location: profil.php'); } echo "<p align='center' class='yazi'>GSM numaranızı başında sıfır (0) olmadan yazınız.</p>"; ?> - 12-09-2012, 13:06:16Bu kadar kolay mıydı yaCebR adlı üyeden alıntı: mesajı görüntüle

Acemilik işte hocam.
Teşekkür ederim.
