bir kereden fazla mysql_real_escape

7 Cevap php

Ben sadece bir kez daha veri daha mysql_real_escape eğer bir fark olup olmadığını merak ediyorum?

Yani başka bir kod parçası daha sonra benim web sitesinin bir bölümünde verileri kaçtı, ve eğer. Bu bir sorun olur mu? Ya da bir fark?

7 Cevap

Evet. Ekstra gereksiz ters bölü almak istiyorum.

The right place for mysql_real_escape is right before you send the query to save the data. Every other instance anywhere else in the script is a major design flaw.

Bu tercihen elbette bir kendi db-sınıfında olmalıdır.

Elbette veri çift kaçtı olacaktır.

Sen mysqli uzun yeterince yapışmasını edilmiştir aracılığıyla, mysql_real_escape() tüm parametreli sorguları kullanmanız gerekir.

Evet, bu bir aşırı-maşası sorun olacaktır. Bu ne olursa olsun tam olarak ne yaptığını, herhangi kaçması için aynıdır. Örneğin, eğer ortak kural aşağıdaki dizede çift tırnak kaçmak istiyorum:

bla "foo"

bir kaçışa olduktan sonra

bla \"foo\"

İki olduktan sonra

bla \\\"foo\\\"

ve benzerleri. "Unescapements" sayısı tam olarak "escapements" sayısı aynı olmalıdır. Basit kesme çıkışında \' olur böylece, metin alanlarındaki bazı karakterler aşırı kaçan bazı sitelerde bu sorunun belirtileri görebiliyordu.

Kaçan bir dize gibi görünüyor şey amaçlanan çıkmamış dize oldu, çünkü kaçan ve çıkmamış bir dize ayırt etmek mümkün değildir. Bu nedenle, tekrar kaçmaya çalışırken, kaçışa kaçmak olurdu - ve kaçtı-bir kez metin MySQL okur ne olacak.

Bu nedenle, bir kez daha kaçmayı asla.

O zaman hiç kaçmak gerekmez Ancak, daha iyi bir çözüm, paramterized sorguları kullanmaktır.

Evet, bu bir sorun olacaktır.

For example:
if a is "Joe's House", the first call will produce "Joe\'s House" and the second one will produce "Joe\\\'s House", saving the backslash in the database.

Bu web sunucusu etkin sihirli tırnak vardır ve istemci girişi mysql_real_escape_string kullandığınızda ortaya sorununa benzer. Bu çözülür:

if (! get_magic_quotes_gpc()) {
    $value = mysql_real_escape_string($_GET["value"]);
} else {
    $value = mysql_real_escape_string(stripslashes($_GET["value"])); 
}

(Ikincisi örneğin http://www.php.net/get_magic_quotes_gpc bakınız)

[Aşağıda yorum olarak düzeltmeleri yansıtacak şekilde cevap Düzenlenen]

Evet, bu bir fark yaratıyor:

$string = "I'm Chuck!";
mysql_escape_string($string); // I\'m Chuck!
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck!