SQL Injection durdurmak için karakter kodları ile semboller yerine PHP İşlev

6 Cevap php

Ben MySQL injection girişimlerini durdurmak için bir php fonksiyon yazmak çalışıyorum. Ben ne yapıyorum sembolleri kaldırmak ve onların HTML karakter kodu ile bunların yerine () str_replace kullanıyor. Benim sorun kodları içeren tüm & # olduğunu; ama aynı zamanda kendi kodları ile bu semboller değiştirmek istiyor. Nasıl gibi bir şey içine kodu değiştirmeden yapabilirsiniz:

&#38&#59;&338&#59;#35&#59;32&#59;

İşte benim fonksiyonudur:

function replaceSymbols( $text )
{
   $text = str_replace( '#', '&#35', $text );
   $text = str_replace( '&', '&' $text ); 
   $text = str_replace( ';', '&#59', $text );

   $text = str_replace( ' ', ' ' $text );
   $text = str_replace( '!', '!' $text );
   $text = str_replace( '"', '"' $text );   
   $text = str_replace( '$', '$' $text );
   $text = str_replace( '%', '%' $text );  
   $text = str_replace(  "'" '&#39', $text );
   $text = str_replace( '(', '(' $text );
   $text = str_replace( ')', ')' $text );
   $text = str_replace( '*', '*' $text );   
   $text = str_replace( '+', '&#43', $text );
   $text = str_replace( ',', ',' $text );
   $text = str_replace( '-', '-' $text );
   $text = str_replace( '.', '.' $text );   
   $text = str_replace( '/', '&#47', $text );
   $text = str_replace( ':', ':' $text );   
   $text = str_replace( '<', '&#60;' $text );
   $text = str_replace( '=', '&#61;' $text );
   $text = str_replace( '>', '&#62;' $text );   
   $text = str_replace( '?', '&#63', $text );
   $text = str_replace( '[', '&#91', $text );
   $text = str_replace( '\\', '&#92;' $text );
   $text = str_replace( ']', '&#93;' $text );
   $text = str_replace( '^', '&#94;' $text );   
   $text = str_replace( '_', '&#95', $text );
   $text = str_replace( '`', '&#96', $text );
   $text = str_replace( '{', '&#123;' $text );
   $text = str_replace( '|', '&#124;' $text );   
   $text = str_replace( '}', '&#125', $text );
   $text = str_replace( '~', '&#126', $text );

   return $text;

}

6 Cevap

mysql_real_escape_string ($ metin) ihtiyaçlarını karşılamak olmadığını herhangi bir neden var mı?

Diğerleri çok iyi çalışıyor mysql_real_escape_string() hangi belirtmiştik. Eğer gerçekten htmlentities() . If that's still not converting all the characters you want you can also use strtr() şöyle bir göz varlıklara dönüştürmek istiyorsanız:

$entities = array(
    '#' => '&#35;',
    '&' => '&#38;',
    ....
);

$converted = strtr($input, $trans);

Bu temel sorunları çözmek için çalışmayın - onlar zaten çözülmüş demektir. Eğer temellerini öğrenmek için, ama sonra üretim ortamlarında kendi çözümlerini kullanmak gerekmez istiyorsanız dışında. Sorgu kaçan sorunu is kullanarak mysql_real_escape_string veya parametreli sorgular kullanarak ve çalışır tarafından çözüldü. homebrewed çözümler genellikle işe yaramaz hale getirmek ince bir hata veya özellikleri var. ben şimdi makale bulmak, ama korku kodlama (ya da joel? oldu) kendi strip_tags işlevini yapmaya çalıştım bir arkadaşım hakkında yazdı at jeff atwood ... ve başarısız olamaz. Son zamanlarda, aynı şifreleme için: homebrew hemen hemen her zaman başarısız olur.

your method:
... isn't very well suited for the task at hand, because classical string escaping is fully reversible, while your method is a one way function (not unrelated to hashing ^^).

Neden tutucuları kullanmıyorsunuz? Düzeni kaçan HERHANGİ tür aniden başka bir formatta (HTML karakter kişiler artık iş nerede) çeşit çıktı istiyorum çünkü bir şey unuttum ya, çünkü ya da çalışmak için gitmiyor.

Bağımlı sürücü, güvenlik ötesinde, ayrıca hazırlanmış deyimleri kullanarak hızlı ağ (yerine dizeleri vb yerli ints olarak transfer sayılar, yüzen,) aktarımları ve ayrıştırma, ağ hızını artırır gibi tutucuların ek ek avantajlar elde edebilir.

UPDATE Görünüşe mysql * arayüz tutucuları desteklemiyor. Bu temelde başka bir sürücüde aramak, dağıtım herhangi bir tür için güvenli ya da uygun olmadığı anlamına gelir.

Ben kesinlikle böyle mysql_real_escape_string() olarak başkalarının attılar konserve çözümleri izleyin tavsiye. O dedi, işlev önemli bir şekilde kusurludur. Bir şey güvence zaman, varsayılan politika deny by default olmalıdır. Yani herhangi bir giriş veya isteği bir saldırı olduğunu ve daha sonra giriş incelemek ve bir şey belirleyebilirsiniz eğer kesinlikle not, bir saldırı, buna izin farz demektir. Lütfen işlevi bağlamında, size giriş bilinen, kabul edilebilir bir karakter kümesinde olup olmadığını görmek için kontrol anlamına ve her şeyi kaçmak olurdu. pseudocode:

function replaceSymbols(text):
    result = ""
    for each character c in text:
       if isalpha(c) or isdigit(c):
           append c to result
       else
           append escape(c) to result
    return result