MySQL / PHP - aşağı benim veritabanı yavaş (ya da beklenmedik performans yapmak) olabilir karakterleri kaçan

4 Cevap php

Ben (int)Integer benim sorgu dizeleri kullanmak için onları güvenli hale getirmek için bir ile tüm tamsayılar çalıştırın.

Ben de bu fonksiyon kodu ile benim dizeleri çalıştırmak

if(!get_magic_quotes_gpc()) {
    	   $string = mysql_real_escape_string($string);
    	}


    	 $pattern = array("\\'", "\\\"", "\\\\", "\\0");
    	 $replace = array("", "", "", "");
    		if(preg_match("/[\\\\'\"\\0]/", str_replace($pattern, $replace, $string))) $string = addslashes($string); 


    	$cleanedString = str_replace('%','',$string);

Açıkçası $ cleanedString değişken döndürür. Bu mySQL bir joker ve kullanıcı bunları takılı eğer potansiyel benim sorguları yavaşlatmak (ya da onlara hatalı veri döndürebilir hale) çünkü şimdi ben% karakteri değiştirin. Ben endişe olmalı mySQL için başka özel karakterler var mı?

İkinci bir not, benim arama ve mysql_real_escape_string sonra değiştirmek hakkında yanlış ya da gereksiz bir şey var mı? Ben ilk başlayan iken ben bir web sitesinden aldım ve (eğer doğru hatırlıyorum) bu kaçış dize ilave olarak değiştirin / Bu aramayı kullanmak gerektiğini söyledi. Bu önceden kaçtı enjeksiyon karakterleri kaldırmak için çalışıyor gibi görünüyor?

4 Cevap

evet Ben bir şeyler garip biraz orada gidiş var düşünüyorum.

Açıldığında bu, her şeyden önce, ben sihirli tırnak ve remove bölü için kontrol ediyorum. Eğer gerçekten istediğiniz bilgileri (ve bölü ile muamele edilmiş bir) temsil eden bir dize var bu şekilde.

Eğer özellikle% joker kaldırmak istiyorsanız o zaman sadece bu kaçış olabilir veya tamamen kaldırın. Eğer SQL sorgusunun içine dize eklemeden önce, nihayet mysql_real_escape_string aracılığıyla çalıştırın ve her şey iyi olacak.

$string = $_POST['searchTerm'];
if (get_magic_quotes_gpc()) {
    $string = stripslashes($string);
}
$string = str_replace("%", "", $string);
$safeString = mysql_real_escape_string($string);

Tamam ben birkaç yorum var:

  • Sihirli alıntı özelliği deprecated, PHP çevre sihirli tırnak etkinleştirmeniz asla değildir. Gereksiz olmalı sizin için (inadvisedly) sihirli tırnak etkin olan diğer müşterilerin ortamlara dağıtılabilir olabilir kod tasarlarken Yani sürece, kontrol.

  • Eğer karakter dizisi arıyorsanız eğer içinde düzenli ifade preg_match() yanlıştır. Gibi bir düzenli ifade [xyz], tek karakter x, y, z herhangi bir one eşleşir. Bu dize xyI veya yz eşleşmiyor. Ben de tüm bu şekilde aramak veya özel karakterleri değiştirmek gerek sanmıyorum çünkü Neyse, bu akademik olduğunu.

  • mysql_real_escape_string() SQL dizeleri içeride tırnak sokmak niyetinde dize değişmezleri kaçmak için yeterli değildir. Vb diğer tırnak, ters eğik, için dizge ikame yapmak gerek yok

  • % ve _ SQL joker vardır only LIKE ifadeler ile desen eşleştirme kullanırken. Sadece eşitlik veya eşitsizlik operatörleri veya regexplerde ile karşılaştırarak eğer bu karakterler hiçbir anlamı yoktur. Eğer LIKE ifadeler kullanarak bile, SQL enjeksiyon karşı savunma uğruna bu karakterleri kaçmayı gerek yoktur. Onlara olarak değişmez karakterleri (bir ters eğik çizgi ile kaçış durumda) veya LIKE ifadesi (sadece onları terk durumda) wildcard tedavi etmek istiyorsanız size kalmış.

  • Değişmez dize değerleri yerine SQL ifadeleri içine PHP değişkenleri interpolating yaparken Yukarıdakilerin hepsi geçerlidir. Yerine interpolasyon bound query parameters kullanırsanız kaçan hiç gerekli değildir. Bound parametreleri düz "mysql" API mevcut değil, ama sadece "mysqli" API.

  • SQL tablo adları, sütun adları veya diğer SQL sözdizimi yerine PHP değişkenleri interpolate nerede başka bir durumdur. Bu tür durumlarda bağlı parametreleri kullanamazsınız; bağlı parametreler only dize hazır yerini alabilir. Eğer (kullanıcının tercihi ORDER BY bir sütun örneğin) sütun adı dinamiğini yapmak gerekiyorsa, gereken delimit the column name (MySQL) geri tırnak veya köşeli parantez ile (Microsoft ) veya çift tırnak (diğer standart SQL).

Yani senin kodu sadece aşağıdaki azaltılmış olabilir söyleyebilirim:

$quotedString = mysql_real_escape_string($string);

İşte if Eğer enterpolasyon için dize kullanmak için gidiyoruz bulunuyor; Eğer ilişkili bir parametre değeri olarak kullanmak için gidiyoruz eğer, hatta basittir:

$paramString = $string;

mysql_real_escape_string () sizin için bu karakterleri kaçar:

\ X00 \ n, \ r, \, ', "ve \ x1a

Yani bunları kendiniz kaçmak gerekmez. Ben sihirli tırnak üzerinde ise, o zaman () mysql_real_escape_string kullanmak eğik çizgi kaldırma öneririz:

if(get_magic_quotes_gpc()) {
    $string = stripslashes($string);
}

$string = mysql_real_escape_string($string);

$cleanedString = str_replace('%','',$string);

Ayrıca, MySQL altını Tek karakter için joker, bu yüzden bu konuda bir şeyler yapmak isteyebilirsiniz.

SQL enjeksiyon sorunları hakkında gerçekten endişeli iseniz şiddetle hazırlanmış deyimleri kullanmayı düşünmelisiniz. Kullanıcı-herhangi bir veri bulunmadan önce SQL deyimi değerlendirilir çünkü kod çok daha güvenlidir.

PDO ve mysqli görün