Türkiye'nin En Eski Webmaster Forumu İyinet'e Hoşgeldiniz!

SQL Injection Yememem İçin

tolgahat

0
Onaylı Üye
Üye
Katılım
28 Eylül 2004
Mesajlar
896
Açılan Konu
107
Tepki puanı
0
PHP:
<?
	// Sayfa Ayarları Yapılıyor...
	include 'ayar.php';

	if(empty($_GET[id]) || $_GET[id] == '' || (integer)$_GET[id] == 0) { 
    die('URL\'de oynama yapmaya kalkismayiniz! Anladın Sen Onu'); 
   }  

    else { 
    $id_sent = (integer)$_GET[id]; 
} 
        $strSQL=mysql_db_query($veritabani,"UPDATE .$site_tableName SET hit=hit+1 WHERE id='$id_sent'");
	$satir=mysql_fetch_array(mysql_db_query($veritabani, "SELECT * FROM  .$site_tableName WHERE id='$id_sent' "));
	
	
	
?>

Yukardaki integer olayı yeterlimidir extra bişey eklemek lazım mı şuan bu şekil ayarladım ama sayfa gösterimi oldukça fazla olan bir sitem var biraz acemiyim php de integer kodunuda iyinetten buldum..

Bilgilerinizi paylaşırsanız sevinirim.
 

atay

0
Onaylı Üye
Üye
Katılım
29 Ekim 2005
Mesajlar
3,592
Açılan Konu
298
Tepki puanı
36
ben hep bu fonksiyonumdan geçiriyorum:

function htmlkodla($deger) {
$karakter=array("UNION",">","<","'","\"");
$kodla=array("UN1ON",">","<","'",""");
$deger=str_replace($karakter,$kodla,$deger);
return $deger;
}

gelebilecek bütün tehlikeleri önce html koda çevirip değişkeni daha sonra sql içine sokunca risk %0 oluyor...
 

dsgnr

0
Onaylı Üye
Üye
Katılım
22 Mart 2006
Mesajlar
1,144
Açılan Konu
129
Tepki puanı
1
Konum
dev
PHP:
$gelen_veri = striptags($_GET['veri']);
$gelen_veri = htmlspecialchars($gelen_veri);
echo $gelen_veri;
şimdi daha iyi :)
 

tolgahat

0
Onaylı Üye
Üye
Katılım
28 Eylül 2004
Mesajlar
896
Açılan Konu
107
Tepki puanı
0
PHP:
     function htmlkodla($id_sent) {
     $karakter=array("UNION",">","<","'","\"");
     $kodla=array("UN1ON",">","<","'",""");
     $id_sent=str_replace($karakter,$kodla,$deger);
     return $id_sent;
}

şu şekilde ekledim.. bide alta

dsgnr senin dediğini uyarlamadım abi bu arada ilgilendiğiniz için tşkler.

yada dsgnr sen numeriği silip böyleme mi yapmamı istiyosun..
 

dsgnr

0
Onaylı Üye
Üye
Katılım
22 Mart 2006
Mesajlar
1,144
Açılan Konu
129
Tepki puanı
1
Konum
dev
PHP:
     function htmlkodla($id_sent) {
     $karakter=array("UNION",">","<","'","\"");
     $kodla=array("UN1ON",">","<","'",""");
     $id_sent=str_replace($karakter,$kodla,$deger);
     return $id_sent;
}

şu şekilde ekledim.. bide alta

dsgnr senin dediğini uyarlamadım abi bu arada ilgilendiğiniz için tşkler.

yada dsgnr sen numeriği silip böyleme mi yapmamı istiyosun..
üstte ki fonksiyonda yapılan işlem
< = <
bunun gibi çeviri işleri
htmlspecialchars($veri);
ile bütün halde yapılabilinir. maksat işlemin uzamaması.
 

tolgahat

0
Onaylı Üye
Üye
Katılım
28 Eylül 2004
Mesajlar
896
Açılan Konu
107
Tepki puanı
0
PHP:
  $idnum = (integer)$_GET[id]; 
	$id_sent = htmlspecialchars($idnum);

böle yapmam yeterli sanırım artık..
 

atay

0
Onaylı Üye
Üye
Katılım
29 Ekim 2005
Mesajlar
3,592
Açılan Konu
298
Tepki puanı
36
$idnum=htmlkodla($idnum);

daha sağlıklı olur.

dipnot: söylediği üzere fonksiyon htmlspecialchars'ın işlemini yapıyor fakat bu tarz bi konuda kendi fonksiyonumuzu yazmamız bizim lehimizedir. çünkü denetlemeye aniden birşey eklemek/çıkartmak/düzenlemek istersek bunun bir mümkünatı olur.
 

dsgnr

0
Onaylı Üye
Üye
Katılım
22 Mart 2006
Mesajlar
1,144
Açılan Konu
129
Tepki puanı
1
Konum
dev
$idnum=htmlkodla($idnum);

daha sağlıklı olur.

dipnot: söylediği üzere fonksiyon htmlspecialchars'ın işlemini yapıyor fakat bu tarz bi konuda kendi fonksiyonumuzu yazmamız bizim lehimizedir. çünkü denetlemeye aniden birşey eklemek/çıkartmak/düzenlemek istersek bunun bir mümkünatı olur.
atay şu anda senin verdiğin işlemi fazlası ile htmlspecialchars yapmaktadır.

$idnum = (integer)$_GET[id];
$id_sent = htmlspecialchars($idnum);

dedikten sonra ek birşey gerekirse zaten bunun altına ek olarak yazabilir. senin verdiğin kod ile işi uzatmış olur sadece.
 

atay

0
Onaylı Üye
Üye
Katılım
29 Ekim 2005
Mesajlar
3,592
Açılan Konu
298
Tepki puanı
36
kendin pişir kendin yeciyim ben :p lazım olursa & da eklerim fonksiyona olur biter.

tolgahat:

son olarak, sql injeksiyondan gelen karakterleri html karaktere çevirerek ebediyen kurtulabilirsin. veya ' " gibi karakterlerin başına \ 'da ekleyebilirsin.

saat 7 oldu artık, herkese iyi sabahlar diyerek uykulu gözlerimle yatağıma süzüleyim :)
 

dsgnr

0
Onaylı Üye
Üye
Katılım
22 Mart 2006
Mesajlar
1,144
Açılan Konu
129
Tepki puanı
1
Konum
dev
kendin pişir kendin yeciyim ben :p lazım olursa & da eklerim fonksiyona olur biter.

tolgahat:

son olarak, sql injeksiyondan gelen karakterleri html karaktere çevirerek ebediyen kurtulabilirsin. veya ' " gibi karakterlerin başına \ 'da ekleyebilirsin.

saat 7 oldu artık, herkese iyi sabahlar diyerek uykulu gözlerimle yatağıma süzüleyim :)
yaw o işlemlerin hepsini zaten htmlspecialchars yapıo

ör :

giden veri : <script>alert("selam");</script>

#########
$veri = '<script>alert("selam");</script>';
$islem = htmlspecialchars($veri);
echo $islem;
#########

bunun çıktısı : <script>alert("selam");</script> bu olacak
 

tolgahat

0
Onaylı Üye
Üye
Katılım
28 Eylül 2004
Mesajlar
896
Açılan Konu
107
Tepki puanı
0
php.netten baktım bende yani kodları şişirmeye gerek yok gibim geldi bana belki aralamlarda atayınki daha sağlıklı olabilir ama genelde olarak htmlspecialchars güzel.

Description
string htmlspecialchars ( string $string [, int $quote_style [, string $charset]] )

Certain characters have special significance in HTML, and should be represented by HTML entities if they are to preserve their meanings. This function returns a string with some of these conversions made; the translations made are those most useful for everyday web programming. If you require all HTML character entities to be translated, use htmlentities() instead.

This function is useful in preventing user-supplied text from containing HTML markup, such as in a message board or guest book application. The optional second argument, quote_style, tells the function what to do with single and double quote characters. The default mode, ENT_COMPAT, is the backwards compatible mode which only translates the double-quote character and leaves the single-quote untranslated. If ENT_QUOTES is set, both single and double quotes are translated and if ENT_NOQUOTES is set neither single nor double quotes are translated.

The translations performed are:

* '&' (ampersand) becomes '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'

Example 2353. htmlspecialchars() example
<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // <a href='test'>Test</a>
?>
 

dsgnr

0
Onaylı Üye
Üye
Katılım
22 Mart 2006
Mesajlar
1,144
Açılan Konu
129
Tepki puanı
1
Konum
dev
bunların yanı sıra

htmlentities(); ve strip_tags(); ıda incele.
 

fan

0
Onaylı Üye
Üye
Katılım
4 Şubat 2007
Mesajlar
663
Açılan Konu
66
Tepki puanı
0
Konum
Nereye
$gelen = int($_GET['id']);

:)

en azından id için başka bişey yapmana gerek yok.
 

tolgahat

0
Onaylı Üye
Üye
Katılım
28 Eylül 2004
Mesajlar
896
Açılan Konu
107
Tepki puanı
0
arama kısmında ne gibi korulamalar alabiliriz htmlspecialchars() yeterli olurmu..
 

tolgahat

0
Onaylı Üye
Üye
Katılım
28 Eylül 2004
Mesajlar
896
Açılan Konu
107
Tepki puanı
0
herkeze teşekkürler bende asp de replace yapıyodum php ye geçince böle sıkıntılarım oldu açıkçası öğrenmek te fayda var önce güvenlik.
 

saho

0
Onaylı Üye
Üye
Katılım
24 Ocak 2007
Mesajlar
44
Açılan Konu
2
Tepki puanı
0
Konum
adana-ist-tokat
htmlspecialchars strip_tags yeterli olmaz integer olmasa idi şappilerlerdi seni
foreach($_POST as $sa=>$ho) $_POST[$sa]=addslashes($_POST[$sa]);
ile ' OR 1=1 gibi bir injeksiyonu engelleyebilirsiniz
bakınız soyturk un spiderbot a yaptığı sitedkei üyelik sistemindeki ' or 1=1 açığı ile rahatça admine hoplanabiliyor :p slashes leyerek engellenebiliyor
mysql_real_escape_string bir çok yerde öneriliyor başta php.net olarak genel içeriği slashes ve htmlspecialchars ve union or ları boşlukla dğeişmesi yani silmesi
 

*siber*

0
Onaylı Üye
Üye
Katılım
20 Temmuz 2005
Mesajlar
2,014
Açılan Konu
108
Tepki puanı
1
Konum
about:blank
htmlspecialchars varken ekstraya gerçekten gerek yok :)
 

iyinet

Root
Root
İyinet Ekibi
Onaylı Üye
Katılım
2 Eylül 2002
Mesajlar
5,034
Açılan Konu
485
Tepki puanı
75
Konum
SEO
MySQL icin:
1. sorgunuzda tirnak '' kullanin, veri tipi integer bile olsa.
2. sorgunuzda addslashes kullanin

Ornek:
PHP:
<?
$id=$_GET['$id'];
mysql_query("select ad,soyad from tablo where id = '".addslashes($id)."'");
?>

Bu sorguda id ile SQL injection yapildigini varsayalim:

Ornek:
program.php?id=' OR 1=1
seklinde cagrilsin


$id=$_GET['$id'];
// $id = "' OR 1=1" degerini icerir

mysql_query("select ad,soyad from tablo where id = '".addslashes($id)."'");
// mysql sorgusu bu sekli alir ve sonuc dondurmez: select ad,soyad from tablo where id = '\' OR 1=1'

Sonuc dondurmemesi bu durumda iyidir, cunku sorguya SQL injection yapilmistir ama basarisiz olmustur.
 
Üst