PHP bir dizge çift kat mysqli_real_escape_string olduğu zaman ne olur

6 Cevap php

Ben mysqli kullanıyorum.

Ben echo mysqli_real_escape_string($db,mysqli_real_escape_string($db,'"'));

which one of those will be the output: 1. \" 2. \\\" ?

Bir dize zaten kaçtı olup olmadığını kontrol etmek için güvenli bir yolu var mı?

Ben 24 saat boyunca MySQL erişemiyor gibi ne yazık ki, ben şu anda test edemez.

6 Cevap

Çıkış \\\" (ikinci örnek) olduğunu.

Ben size güvenilir bir dize zaten kaçtı olmuştur ya, size sadece mysqli_real_escape_string() kez çağrı bir şekilde kodunuzu düzenlemek gerektiğini olmadığını söyleyebilirim sanmıyorum.

Sonuç dizesi \\\" (her iki karakter kaçış) olacaktır.

Tarafından ise "güvenli" "kusursuz" demek, o zaman hayır. Eğer ilgili karakterler kaçtı olduğunu kontrol bile o supposed \" olmak ve dizeleri için ayarlanmış olabilir herhangi bir gizli bayrakları vermeyin eğer, sen bilemezsin kaçan edilerek olarak işaretlemek.

Ancak, el iki kez mysqli_real_escape_string çağrı olmamalıdır. Sadece ihtiyacınız şu anda bunu.

"Çift kaçan" ana kaynağını saklı * kaçan bir şey yapıyoruz, ama sihirli tırnak kapatmak ya da üzerinde iseniz bunları kaldırın ne.

* Peki, parametreli sorgular kullanarak olmadan alabilirsiniz olarak yakındır.

Bir dize zaten kaçtı edilmiş ise kaçtı edilmiş bir dize de bir kullanıcıyı (ve dolayısıyla çıkmamış olması) girmiş olabilirdi, çünkü söyleyemem.

İkinci bir iade edilecektir. " ilk \" (" kaçan) dönüştürülür ve sonra da \\\" () [({4 kaçan dönüştürülecektir ]} ve ").

Genel olarak kendi üzerinde bunu yapmak zorunda. "Özelliği" olsa da Magic Quotes o karakterin ', ", \ ve NULL karakteri ters eğik çizgi eklese edin Gelen veri, Sihirli Tırnaklar korkunç bir buluş ve PHP 6 kaldırılacaktır. Ayıca onlar bir sunucu üzerinde etkin ve başka devre dışı olabilir. Bu yüzden bile güvenilir değil.

Ama daha önemlisi, sadece (string syntax in MySQL daha fazla bilgi için bakınız) bu karakterlere sadece ancak diğer karakter de bakmak zorunda değil MySQL gibi onlar MySQL için uygun olmamasıdır.

() Birden çok kez mysqli_real_escape_string çağırarak sorgu az güvenli yapmaz. Bu veri, ancak bozuk yapar. Iyi bir örnek Conan O'Brien.

Aşağıdaki yoksa:

$name=mysqli_real_escape_string($db,mysqli_real_escape_string($db,"Conan O'Brien"));
//At this point $name is Conan O\\\'Brien
mysql_query("insert into table (name)values('$name')")
//In the database the name will be stored as: Conan O\'Brien  Which is corrupt.   

Bu yolsuzluk ile anlaşma için aşağıdakileri yapabilirsiniz:

funciton strip_all($var){
    $len=strlen($var);
    $ret=stripslashes($var);
    while($len!=strlen($ret)){
        $len=strlen($ret);
        $ret=stripslashes($ret);
    }
    return ret;
}
//$name is unkown somthing like: Conan O\\\\\\\'Brien
$name=strip_all($name);
//$name is: Conan O'Brien
$name=mysqli_real_escape_string($db,$name);
//$name is: Conan O\'Brien,  which is properly escaped.
mysql_query("insert into table (name)values('$name')")
//In the database the value is Conan O'Brien,  mysql will eat the back slash. 

En iyi yaklaşım öncelemeli geliyor takip etmektir. Magic_quotes özürlü veya etkin, ve sonra daha fazla karakter kaçar çünkü daha iyi güvenlik sağlar mysqli_real_escape_string () kullanmak ise, bu durumda biz hesap.

if(get_magic_quotes_gpc())
{
   $name=stripslashes($_GET[name]);
}
$name=mysqli_real_escape_string($db,$_GET[name]);
//At this point $name is Conan O\'Brien
mysql_query("insert into table (name)values('$name')")

Bazı ekstra bilgi eklemek için.

Kaçış ekstra sembolleri tanıtan olmadan sembolleri bir dizi ekstra bilgi eklemek için bir yoldur. Bunu yapmak için, en az bir sembolü 'kaçış' sembolü olarak işlev alır. Bu, orijinal rol kaybolması anlamına gelir ve bir çıkış dizisi kullanılarak ilave edilmesi gerekmektedir.

Örnek:

A, b ve c: Biz 3 sembollerle bir dil var. Ki içinde yer alan simgeler aşağıdaki işlevleri vardır:

Language 1
a has the function A
b has the function B
c has the function C

Biz şimdi fonksiyonları D ve E tanıtmak gerekiyor, ama biz ekstra semboller eklemek mümkün değildir.

Bu yüzden bir kaçış sembol kullanarak bunu yapabilirsiniz:

Language 2
a, is now the escape symbol.
aa has the function A
ab had the function D
ac has the function E
b  has the function B
c  has the function C

Dizisi aabcabac, dil 1 kullanılarak yorumlanır eğer AABCABAC okur. Ama dili 2 ABCDE okur kullanılarak yorumlanır.

Bu sorun çoğu zaman, sen sembollerden kullanılan dili belirlemek mümkün değildir olmasıdır. Bu meta bilgileri veri işlenmeden önce temin edilmesi gerekmektedir.

Botom satırda bir dize yeterli kaçan olup olmadığını belirlemek için güvenli bir yol olması.