MySql'de kesme işareti (') nasıl kaçar?


147

MySQL belgelerine olması gerektiğini söylüyor \'. Ancak, hem scite hem de mysql bunun ''işe yaradığını gösterir . Bunu gördüm ve işe yarıyor. Ne yapmalıyım?


Eğer ister bahsediyorsunuz ''ya \'doğrudur?
Raptor

\'''yanılmıyorsam
ANSQL

SQL uygulamasına bağlı olarak; - '' \ '', '\' 've bazen' [']' 'koddan çıkmaya izin verir. Bunun üzerine herhangi bir sayıda unicode 'değişikliği bu kontrolü atlayacaktır. Buradaki oyunun tamamı, 'sonuncu sayımın garip olmaktan ziyade gerektirdiği temelli kaçış kalitesini kötüye kullanıyor. Birden fazla kaçış yöntemini birbirine karıştırarak garip bir şekilde sonuçlanırsa, kaçmayı yenebilir ve ham SQL enjekte edebilirsiniz. Hikayenin ahlakı: ASLA dize enterpolasyonu kullanmayın, DAİMA hazırlanmış ifadeler kullanmayın.
Shayne

Yanıtlar:


186

Alıntı yaptığınız MySQL belgeleri aslında bahsettiğinizden biraz daha fazlasını söylüyor. Ayrıca diyor ki,

'” İle alıntılanan bir dizenin içindeki “ '” “ ” olarak yazılabilir ''.

(Ayrıca, Tablo 8.1'in MySQL 5.0 sürümüne bağladınız. Özel Karakter Kaçış Dizileri ve geçerli sürüm 5.6 - ancak geçerli Tablo 8.1. Özel Karakter Kaçış Dizileri oldukça benzer görünüyor.)

Bence parametre üzerindeki Postgres notubackslash_quote (string) bilgilendirici:

Bu, bir tırnak işaretinin \'bir dize değişmeziyle temsil edilip edilemeyeceğini denetler . Bir alıntı işaretini temsil etmenin tercih edilen SQL standardı yolu, iki katına çıkmasıdır ( ''), ancak PostgreSQL de tarihsel olarak kabul etmiştir \'. Ancak, \'güvenlik riskleri yaratır ...

Bana göre, iki katına çıkarılan tek tırnaklı karakter kullanmanın, tek tırnaktan kaçmak için ters eğik çizgi kullanmaktan daha iyi bir genel ve uzun vadeli seçim olduğunu söyleyebilirim.

Şimdi, dil seçimi, SQL veritabanı seçimi ve standart dışı tuhaflıklar ve denkleme sorgu çerçevesi seçimi eklemek istiyorsanız, farklı bir seçim yapabilirsiniz. Kısıtlamalarınız hakkında fazla bilgi vermiyorsunuz.


42

Standart SQL, ikiye katlanmış alıntılar kullanır; MySQL bunu makul bir şekilde uyumlu kabul etmelidir.

'He said, "Don''t!"'


Oldukça 'gerektiğini' yerine 'may' diyor, ama bilgi (tablonun altında) vardır: Bir “: Bir dize içinde tırnak karakterleri içerecek şekilde çeşitli yolları vardır '” ile alıntı dize içinde “ '” “olarak yazılabilir ''” . “ "” İle alıntılanan bir dizenin içindeki “ "” “ ” olarak yazılabilir "". Tırnak karakterinden önce bir kaçış karakteri (“` `”) koyun.
Jonathan Leffler

1
Kesme işareti ile iki katına çıkmanın en iyi yolu budur.
Alex _TNT

10

Kullanıcı2087510'un ne demek istediğine inanıyorum

name = 'something'
name = name.replace("'", "\\'")

Bunu da başarıyla kullandım.


1
Bu en iyi yanıtlar
Jared

1
neden \ 'yerine \\'?
biniam

@biniam_Etiyopya ikincisi \ ilkinden kaçar
Juha Untinen

2
olası güvenlik sorunu. dize zaten \ 'içeriyorsa sql enjeksiyonunu alabilir, böylece dizede \\' olarak bulunan ve dizeyi sonlandıracak bir \ eklersiniz. Bunun yerine name.replace ("'", "' '") kullanın
Garr Godfrey


5

İşte bir örnek:

SELECT * FROM pubs WHERE name LIKE "%John's%"

Sadece tek tırnak içine çift tırnak kullanın.

Tek tırnak işareti kullanmakta ısrar ediyorsanız (ve karakterden kaçmanız gerekiyorsa):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'

4

Farkında olmamın üç yolu var. Birincisi çoğu programlama dilinde en güzel ve ikincisi ortak yol:

  1. Başka bir tek tırnak kullanın: 'I mustn''t sin!'
  2. \Tek tırnak işaretinden önce kaçış karakterini kullanın ':'I mustn\'t sin!'
  3. Dizeyi tek tırnak işaretleri yerine içine almak için çift tırnak kullanın: "I mustn't sin!"

Kişisel tercihim \'pek çok programlama dili tarafından kullanıldığı gibi, ancak ''daha fazla SQL lehçesi tarafından desteklendiği için, seçenek 1'i kullanmak uyumluluk için daha iyidir. Sqlite, ters eğik çizgi kaçışlarıyla çalışmaz.
okdewit

0

Dizeyi değiştirin

value = value.replace(/'/g, "\\'");

Burada değer, Veritabanınızda depolanacak dizenizdir.

Daha ileri,

Bunun için NPM paketi, içine bakabilirsiniz

https://www.npmjs.com/package/mysql-apostrophe


Lütfen cevap olarak sadece bir araç veya kütüphane yayınlamayın. En azından sorunun cevabın kendisinde nasıl çözdüğünü göster .
Baum mit Augen

Bu işe yaramayacak. Bir şeylerden kaçmayı unuttun. değiştirin (/ \ '/ g, "\\\'")
Michael

0

Kesme işaretiyle herhangi bir veri noktanız varsa kesme işaretinden önce bir kesme işareti ekleyebilirsiniz

Örneğin. 'Burası John adlı kişinin yeri'

Burada MYSQL 'John'un yeri' şeklinde iki cümle olduğunu varsayar.

'Burası John'un yeri' koyabilirsiniz. Bu şekilde çalışması gerektiğini düşünüyorum.



0

Muhtemelen konu dışı, ama belki de buraya bir HTML formundan metin girişini sterilize etmenin bir yolunu aradınız, böylece bir kullanıcı kesme işareti karakterini girdiğinde, metni bir SQL'e yazmaya çalıştığınızda bir hata atmaz tabanlı bir tablo. Bunu yapmanın birkaç yolu vardır ve SQL enjeksiyonu hakkında da okumak isteyebilirsiniz, ancak PHP'deki basit bir seçenek, tüm apostroph'larınızı muhtemelen depolamak istediğiniz şeye dönüştürecek olan htmlspecialchars () işlevini kullanmaktır. 'neyse.


Kodlama depolamak için değil, göstermek içindir. Hazırlanan ifadeleri kullanın.
mickmackusa

Hazırlanan beyanların güvenlik ve güvenilirlik için altın standart olduğunu kabul ediyorum. Metin verilerini HTML olarak saklamak isteyebileceğiniz belirli bir vakayı vurgulamaktaydım, bu durumda yöntemim bunun yerine bağlı parametreleri kullanmanın yanı sıra. HTML girişi, HTML çıkışı.
Grindlay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.