İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

SQL Injection Yememem İçin

tolgahat

0
İyinet Üyesi
Katılım
28 Eylül 2004
Mesajlar
896
Reaction score
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
İyinet Üyesi
Katılım
29 Ekim 2005
Mesajlar
3,592
Reaction score
37
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
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
1
Konum
dev
PHP:
$gelen_veri = striptags($_GET['veri']);
$gelen_veri = htmlspecialchars($gelen_veri);
echo $gelen_veri;
şimdi daha iyi :)
 

tolgahat

0
İyinet Üyesi
Katılım
28 Eylül 2004
Mesajlar
896
Reaction score
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
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
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
İyinet Üyesi
Katılım
28 Eylül 2004
Mesajlar
896
Reaction score
0
PHP:
  $idnum = (integer)$_GET[id]; 
	$id_sent = htmlspecialchars($idnum);

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

atay

0
İyinet Üyesi
Katılım
29 Ekim 2005
Mesajlar
3,592
Reaction score
37
$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
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
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
İyinet Üyesi
Katılım
29 Ekim 2005
Mesajlar
3,592
Reaction score
37
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
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
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
İyinet Üyesi
Katılım
28 Eylül 2004
Mesajlar
896
Reaction score
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
İyinet Üyesi
Katılım
22 Mart 2006
Mesajlar
1,144
Reaction score
1
Konum
dev
bunların yanı sıra

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

fan

0
İyinet Üyesi
Katılım
4 Şubat 2007
Mesajlar
663
Reaction score
0
Konum
Nereye
$gelen = int($_GET['id']);

:)

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

tolgahat

0
İyinet Üyesi
Katılım
28 Eylül 2004
Mesajlar
896
Reaction score
0
arama kısmında ne gibi korulamalar alabiliriz htmlspecialchars() yeterli olurmu..
 

tolgahat

0
İyinet Üyesi
Katılım
28 Eylül 2004
Mesajlar
896
Reaction score
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
İyinet Üyesi
Katılım
24 Ocak 2007
Mesajlar
44
Reaction score
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
 

iyinet

Root
Admin
Hosting Firması
Katılım
2 Eylül 2002
Mesajlar
5,028
Reaction score
62
Konum
Sakarya
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.
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Backlink ve Tanıtım Yazısı için iletişime geçmek için Skype Adresimiz: .cid.1580508955483fe5

Üst