Ne addslashes () değil bunu) (mysql_real_escape_string nedir?

11 Cevap php

Neden (mysql_real_escape_string gibi bir DB-özel işlevlerini gerekiyor)? Bu addslashes () değil ki ne yapabilirim?

Şu an için parametreli sorgu üstün alternatif almamak, SQL enjeksiyon) münhasıran hala savunmasız (addslashes kullanan bir webapp, ve evet, nasıl?

11 Cevap

Multibyte kodlanmış dizeleri ile uğraşırken addslashes genellikle yeterince iyi değil.

Bu kadar eğik ekler:

\x00, \n, \r, \, ', " and \x1a. characters.

Addslashes sadece eğik ekler nerede

' \ and NUL

Ilias article, aynı zamanda işlevselliği oldukça detaylı

gs en sert downvoted cevabı aslında çok doğru.

Standart SQL değişmez kesme kaçmak için iki katına kullanır. Kaçan tersbölülerden MySQL'in standart dışı kullanım, varsayılan ayardır, ancak devre dışı ve genellikle sql_mode, ANSI, özellikle edilebilir.

Bu durumda sadece iki sözdizimi çalışacak ve addslashes (veya diğer ad-hoc kaçan yöntemi) kullanılarak herhangi bir uygulama kıracak. mysql_real_escape_string yöntemi kaçan bağlantının SQL_MODE için en iyisi hangisi kullanır.

Hala alt 128 karakterleri yeniden kullanmak o pis Doğu Asya kodlamaları kullanıyoruz, ama sonra gerçekten yerine UTF-8 kullanıyor istiyorsanız Çokbaytlı kodlama sorunu da önemlidir. \ N-kaçan, diğer taraftan, MySQL mükemmel mutlu bir açıklamada ham satırsonu ile başa çıkabilir beri hiçbir endişe kaynağıdır.

mysql_real_escape_string etmez a lot more addslashes göre daha.

addslashes veritabanı hakkında hiçbir şey bilmeden, saf ASCII çalışır. Bu kaçar:

  • '\'
  • "\"
  • \\\
  • ASCII 0\0.

mysql_real_escape_string 'un amacı "bir SQL deyiminde kullanabilirsiniz yasal bir SQL dizesi oluşturmak." Için mysql_real_escape_string the current character set of the connection (her zaman geçerli bir $ mysql nesne geçmelidir neden olduğu) dikkate alır.

Bu (MySQL C API belgelerine alınan) şunları yapar:

  • Kodlar: \, ', ", ASCII 0, \n, \r ve Control+Z sorunlara neden olmayacak bir şekilde
  • Bir 0 bayt (C API olarak) dize sona erer sağlar
  • DB $ mysql de bağlantılı ise geniş karakter dönüşüm bir multibyte (ASCII) gerçekleştirebilir geniş bir karakter kümesini kullanır.

Gerçekten içten nasıl PHP mağaza dizeleri bilmiyorum, ama nokta tüm bu kullandığınızda PHP kullanılabilir mysql_real_escape_string olduğunu. I addslashes (hatta bağlı olduğunuz DB bilmiyor) değil nerede, farkın ana noktası mysql_real_escape_string considers the character set of the connection sanırım.

Benim bildiğim tek gerçek fark giriş dizesi kaçan zaman mysql_real_escape_string () veritabanının karakterini dikkate ayarlanır alacak olmasıdır. Ne işlevi hala bazı SQL enjeksiyonu açık senaryoyu bırakan vahşi kart Karakterleri% kaçmak ve _ olacaktır.

Göre PHP manual,

X00 \, \ n, \ r, \, ', "ve \ x1a: mysql_real_escape_string () aşağıdaki karakterleri ters slash MySQL kütüphane fonksiyonu mysql_real_escape_string, çağırır.

PHP'nin mysql_real_escape_string fonksiyonu olacak, daha fazla veya daha az, ask mysql what character(s) needs to be escaped, addslashses fonksiyon sadece önünde bir ters eğik çizgi ve tek tırnak ('), çift tırnak ("), ters eğik çizgi () veya nul katacak burada ( NULL byte) karakter.

İki pratik etkileri addslashes kaçtı olması gereken karakterler mysql sorarak, daha da önemlisi, multibyte karakterler ile çalışmak için değil ve eğilimi vardır, bir olası uyumluluk kaçının. Assslashes kullanarak tür kaçış dizisi içine belirli karakterlerin bir çift hardcoding gibidir.

Diğer alıntı imkanı yok bir şekilde MySQL için dizeleri kaçmak gerekiyordu.

Çok tercih Ancak, use the mysqli interface için, ve kullanımı yerine, emin tüm dizeleri doğru kaçtı yapmaya çalışıyorum hazırlanmış sorguları parametrelenmişse. Parametrized sorguları kullanarak böyle dağınık dize iş için ihtiyacı ortadan kaldırır ve güçlü bir SQL enjeksiyon riskini azaltır.

Düzenleme: Ben kötü bir fikir alıntı düşünün neden biraz açıklamak gerekir: Bu ne zaman ve nerede alıntı gerekir unutmak kolay - değişken vs, zaten kote olup olmadığını, bir dize veya sayı olup olmadığını bir Oluşturucu sorgusu has none of these issues, ve alıntı için ihtiyaç completely ortadan kalkar.

Benim anlayış mysql_real_escape_string göre (), bu ne ilk kodlanmış gerektiğini kontrol edin ve buna göre kodlamak için db ile iletişim gibi, daha doğrusu işi değil mi? Yani orada daha effeciently çalışmak için

İlk addslashes yapmak istiyorum ve daha sonra o veriyi gösteren önce eğik ve hala quering için db fonksiyonları gibi mysql_query kullanıyorsanız mysql_real_escape_string, kullanım mysql_real_escape_string kadar verimli değildir addslashes, ya da ben PDO hazırlamak ile daha iyi bir yol olduğunu düşünüyorum kaldırmak neden , mysql_real_escape_string db özgü olduğu

Neden (mysql_real_escape_string gibi bir DB-özel işlevlerini gerekiyor)?

Actually, most of time we don't.
This function is required for a few extremely rare encodings, and to prettify mysql logs and dumps a bit.

addslashes kullanan bir webapp () SQL enjeksiyon için sadece hala savunmasızdır?

Sürece herhangi bir tek-bayt charset veya utf8 kullanıyor gibi - it is perfectly safe with addslashes().

Bu addslashes () değil ki ne yapabilirim?

Bazı nadir kodlamaları durumunda SQL string literal koruyabilirsiniz.

However, it can't do it by itself. düzgün bir kodlama ilk mysql_set_charset() fonksiyonu kullanılarak ayarlanmalıdır. Bu fonksiyon charset kullanım açısından, mysql_real_escape_string() would behave exactly the same way as addslashes() kullanılmamış varsa - tüm hiçbir fark olacaktır.