2012-05-18 7 views
52

Does $_SESSION['username'] need to be escaped before getting into an SQL query? okuyordum ve "Kökeni ne olursa olsun, sql sorgusuna ilettiğiniz her dize kaçmanız gerekiyor" ifadesini kullandı. Şimdi böyle bir şey biliyorum gerçekten temel. Bir Google araması 20.000'den fazla sonuç aldı. Stackoverflow'un yalnızca 20 sayfalık sonuçları vardı, ancak hiç kimse aslında bir dizgeden kaçtıklarını veya nasıl yapılacağını açıklamıyor. Sadece varsayıldı. Bana yardımcı olabilir misiniz? Öğrenmek istiyorum çünkü her zaman olduğu gibi PHP'de bir web uygulaması yapıyorum.Bir dizeden kaçmak ne anlama geliyor?

ben baktım: Inserting Escape Characters, What are all the escape characters in Java?, Cant escape a string with addcslashes(), Escape character, what does mysql_real_escape_string() really do?, How can i escape double quotes from a string in php?, MySQL_real_escape_string not adding slashes?, I could go, ancak noktası olsun eminim remove escape sequences from string in php. Bu tembel değil.

+4

PS sadece bir arkadaş sordu ve Kendimi aptal yerine koymadım ama sanki herkesin bahsettiği şeyin ne olduğunu merak etmeme benzeyen pek çok insan olacağını düşündüm. – Brett

cevap

95

o dizede kullanılan tırnak (ve diğer karakterlerin) belirsizlik azaltma anlamına gelmektedir. Eğer bir dize tanımlarken yaparken Örneğin, genellikle çift tırnak veya tek tırnak ya bunu çevreleyen:

"Hello World." 

Ama ne benim dize içindeki çift tırnak olsaydı?

"Hello "World."" 

Şimdi belirsizliklerim var - yorumlayıcı dizgemin nerede bittiğini bilmiyor. Çift tırnaklarımı tutmak istersem, birkaç seçeneğim var. parçası olmak

"Hello \"World.\"" 

kaçtı ve bir eğik çizgi öncesinde herhangi alıntı anlaşılan:

'Hello "World."' 

Ya benim tırnak kaçabilir: Ben string tek tırnak kullanabilirsiniz dizenin değeri. o sorgular gelince

, MySQL biz bazı karışıklığa neden olmadan bizim sorgularda kullanamazsınız için saatler belirli anahtar kelimeleri vardır. Biz sütun "Seç" seçildi değerlerin bir tablo vardı varsayalım ve biz bunun seçmek istedik:

SELECT select FROM myTable 

Biz şimdi bizim sorguya bazı belirsizlik sunduk. Bizim sorgusu içinde, geri-kene kullanarak bu belirsizliği azaltabilir:

SELECT `select` FROM myTable 

Biz alan adlarını seçiminde kötü karar kullanarak sunduk karışıklığı ortadan kaldırır.

Değerlerinizi yalnızca mysql_real_escape_string() üzerinden geçirerek bunun bir çoğu sizin için ele alınabilir. Örnekte Eğer bunu bizim sorgu için herhangi bir soruna neden olmaz emin olmak için bu fonksiyonu sayesinde kullanıcı tarafından gönderilen verileri geçirildiğinden emin görebiliriz:

// Query 
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
      mysql_real_escape_string($user), 
      mysql_real_escape_string($password)); 

diğer yöntemler kaçan dizeleri için var, örneğin add_slashes olarak, Yapabilirdim addcslashes, quotemeta ve hedef tarafından güvenli bir sorguyu çalıştırmak için ve büyük geliştiriciler PostgreSQL bağlamında (mysql_real_escape_string veya pg_escape_string tercih yaparken göreceksiniz rağmen, daha fazla.

+0

Bunun için bir çok şeyin sizin için değerlenebileceğini söylediniz. 'Mysql_real_escape_string()' cevabınızı genişletip, neyin büyük bir soruyu soramayacağını veya neyin olduğunu söyleyebilmenizi sağlayabilir misiniz? – Brett

+0

@Brett Sorun değil, cevabın sonuna biraz daha ekledim. – Sampson

+0

Teşekkürler @Jonathan çok beğeni topladı. – Brett

15

Bazı karakterler, kullanmakta olduğunuz SQL veritabanı için özel bir anlama sahiptir. Bu karakterler bir sorguda kullanıldığında, bir saldırganın veritabanınızı etkilemesine izin vermek de dahil olmak üzere beklenmeyen ve/veya istenmeyen davranışlara neden olabilir. Bu karakterlerin bir sorguyu bu şekilde etkilemesini engellemek için veya bu yöntemden farklı bir şekilde söylemek gerekirse, veritabanına bu sorguda özel karakterler olarak davranılmaması söylenmesi gerekir. mysql_real_escape_string() durumunda

o \x00, \n, \r, \, ', " ve bunlar \x1a, kaçan değilken, MySQL veritabanı ile SQL enjeksiyonu içerir önce belirtilen sorunlara neden olabilir kaçar. bir dize Kaçan

+0

@thanks John, bu iyi bir başlangıç ​​cevabıydı. Aynı zamanda geçerli bir cevap olduğu için birisini de işaretlediğine gerçekten memnun oldum. – Brett