MySql में apostrophe (') से कैसे बचें?


147

MySQL प्रलेखन का कहना है कि यह होना चाहिए \'। हालांकि, दोनों scite और mysql से पता चलता है कि ''काम करता है। मैंने देखा कि यह काम करता है। मुझे क्या करना चाहिए?


क्या आप सही ''या \'सही के बारे में बात कर रहे हैं ?
रैप्टर

\'''अगर मैं गलत नहीं हूं तो MySQL विशिष्ट है, ANSI SQL
कंप्लेंट है

SQL के कार्यान्वयन के आधार पर; - '' \ '', '\' '', और कभी-कभी '' '' '' '' कोड से विराम की अनुमति देगा। इसके शीर्ष पर यूनिकोड की किसी भी संख्या के प्रतिस्थापन इस चेक को बायपास कर देंगे। यहाँ पूरा खेल '' आधारित भागने की गुणवत्ता का हनन कर रहा है कि इसके लिए अंतिम 'गणना' की आवश्यकता है बजाय विषम की। यदि यह एक दूसरे में कई भागने के तरीकों को मिटाकर विषम समाप्त होता है, तो आप बचने को हरा सकते हैं और कच्चे एसक्यूएल को इंजेक्ट कर सकते हैं। कहानी का नैतिक: कभी भी स्ट्रिंग इंटरपोलेशन का उपयोग न करें, हमेशा तैयार किए गए कथनों का उपयोग करें।
Shayne

जवाबों:


186

आपके द्वारा उद्धृत MySQL प्रलेखन वास्तव में आपके द्वारा उल्लिखित से थोड़ा अधिक कहता है। यह भी कहता है,

" '" के साथ उद्धृत स्ट्रिंग के अंदर एक " '" के रूप में लिखा जा सकता है ''

(इसके अलावा, आप तालिका 8.1 के MySQL 5.0 संस्करण से जुड़े हैं विशेष वर्ण एस्केप अनुक्रम , और वर्तमान संस्करण 5.6 है - लेकिन वर्तमान तालिका 8.1। विशेष वर्ण एस्केप अनुक्रम बहुत समान दिखता है।)

मुझे लगता है कि backslash_quote (string)पैरामीटर पर पोस्टग्रेज नोट सूचनात्मक है:

यह नियंत्रित करता है कि क्या \'एक स्ट्रिंग चिह्न को एक स्ट्रिंग शाब्दिक में दर्शाया जा सकता है । उद्धरण चिह्न का प्रतिनिधित्व करने के लिए पसंदीदा, SQL- मानक तरीका है इसे दोगुना करके ( '') लेकिन PostgreSQL ने ऐतिहासिक रूप से भी स्वीकार किया है \'। हालांकि, \'सुरक्षा जोखिम पैदा करता है ...

यह मेरे लिए कहता है कि एकल-उद्धरण से बचने के लिए बैकस्लैश का उपयोग करने की तुलना में दोगुना एकल-उद्धरण वर्ण का उपयोग करना बेहतर समग्र और दीर्घकालिक विकल्प है।

अब यदि आप भाषा का चुनाव, एसक्यूएल डेटाबेस का विकल्प और इसके गैर-मानक क्विर्क, और समीकरण के लिए क्वेरी फ्रेमवर्क का विकल्प भी जोड़ना चाहते हैं, तो आप एक अलग विकल्प के साथ समाप्त हो सकते हैं। आप अपने अवरोधों के बारे में ज्यादा जानकारी नहीं देते हैं।


42

मानक एसक्यूएल दोहरे-अप उद्धरणों का उपयोग करता है; MySQL को स्वीकार करना होगा कि यथोचित अनुपालन हो।

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

+1। यह कहां कहता है कि इसे '' नहीं बचना
user4951

उस पर 'हो सकता है' के बजाय 'चाहिए', लेकिन जानकारी (नीचे दी गई तालिका) है: ए ': वहाँ एक स्ट्रिंग के भीतर उद्धरण वर्ण शामिल करने के लिए कई तरीके हैं '"एक स्ट्रिंग के साथ उद्धृत अंदर" '"के रूप में" लिखा जा सकता है ''" । " "" के साथ उद्धृत स्ट्रिंग के अंदर एक " "" के रूप में लिखा जा सकता है ""। बच चरित्र ("` `") द्वारा बोली चरित्र को प्राथमिकता दें।
जोनाथन लेफ़लर

1
यह एपोस्ट्रोफ को दोगुना करके बचने का सबसे अच्छा तरीका है।
एलेक्स _TNT

10

मेरा मानना ​​है कि user2087510 का मतलब था:

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

मैंने इसका उपयोग सफलता के साथ भी किया है।


1
मेरे लिए काम किया, जबकि उन शीर्ष जवाब नहीं
जारेड

1
क्यों \\ 'के बजाय \\'?
दिन

@biniam_Ethiopia दूसरा \ पहले एक निकल जाता है
जुहा Untinen

2
संभव सुरक्षा मुद्दा। यदि स्ट्रिंग में पहले से ही \ 'है, तो आप sql इंजेक्शन प्राप्त कर सकते हैं, इसलिए आप एक \ _ डालें, जो अब स्ट्रिंग में \\' के रूप में है जो स्ट्रिंग को समाप्त कर देगा। इसके बजाय name.replace ("" "," '' ") का प्रयोग करें
Garr Godfrey

6

सिर्फ दो बार i के ''स्थान पर लिखना''


1
एक के स्थान पर दो बार एपोस्ट्रोपी का उपयोग करें
MRRaja

5

यहाँ एक उदाहरण है:

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

एकल उद्धरण को संलग्न करने के लिए बस दोहरे उद्धरण चिह्नों का उपयोग करें।

यदि आप एकल उद्धरण (और चरित्र से बचने की आवश्यकता) का उपयोग करने पर जोर देते हैं:

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

4

तीन तरीके हैं जिनसे मैं अवगत हूं। पहला सबसे सुंदर नहीं है और दूसरा अधिकांश प्रोग्रामिंग भाषाओं में सामान्य तरीका है:

  1. एक और एकल उद्धरण का उपयोग करें: 'I mustn''t sin!'
  2. \एकल उद्धरण से पहले बच चरित्र का उपयोग करें ':'I mustn\'t sin!'
  3. एकल उद्धरणों के बजाय स्ट्रिंग संलग्न करने के लिए दोहरे उद्धरण चिह्नों का उपयोग करें: "I mustn't sin!"

मेरी व्यक्तिगत पसंद होगी \'क्योंकि यह कई प्रोग्रामिंग भाषाओं द्वारा उपयोग किया जाता है, लेकिन ''अधिक SQL बोलियों द्वारा समर्थित है, इसलिए संगतता के लिए विकल्प 1 का उपयोग करना बेहतर है। उदाहरण के लिए स्क्लाइट बैकस्लैश एस्केप से काम नहीं करता है।
ओकेडिट

0

स्ट्रिंग को बदलें

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

जहां मान आपका स्ट्रिंग है जो आपके डेटाबेस में संग्रहीत होने वाला है।

आगे की,

इसके लिए एनपीएम पैकेज, आप इसमें देख सकते हैं

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


कृपया उत्तर के रूप में कुछ टूल या लाइब्रेरी पोस्ट न करें। कम से कम यह प्रदर्शित करें कि यह उत्तर में समस्या को कैसे हल करता है।
बौम Augen mit

वह काम करने वाला नहीं है। आप चीजों से बचना भूल गए। बदलें (/ \ '/ g, "\\\'")
माइकल

0

मुझे लगता है कि अगर आपके पास एपोस्ट्रोफ के साथ कोई डेटा बिंदु है तो आप एपोस्ट्रोफ से पहले एक एपोस्ट्रोफ जोड़ सकते हैं

जैसे। 'यह जॉन की जगह है'

यहाँ MYSQL दो वाक्य मानता है 'यह जॉन की जगह है'

आप 'यह जॉन की जगह है' डाल सकते हैं। मुझे लगता है कि इस तरह से काम करना चाहिए।



0

संभवतः ऑफ-टॉपिक, लेकिन हो सकता है कि आप HTML फॉर्म से टेक्स्ट इनपुट को सैनिटाइज करने का तरीका ढूंढ रहे हों, ताकि जब कोई उपयोगकर्ता एपॉस्ट्रॉफी कैरेक्टर इनपुट करे, तो जब आप एसक्यूएल को टेक्स्ट लिखने की कोशिश करते हैं, तो यह एक त्रुटि नहीं है। एक DB में आधारित तालिका। ऐसा करने के कुछ तरीके हैं, और आप SQL इंजेक्शन के बारे में भी पढ़ना चाह सकते हैं, लेकिन PHP में एक सरल विकल्प htmlspecialchars () फ़ंक्शन का उपयोग करना है जो आपके सभी एपोस्ट्रोफों को बदल देगा 'जिसमें संभवतः आप स्टोर करना चाहते हैं वैसे भी।


एनकोडिंग भंडारण के लिए नहीं है, यह प्रदर्शित करने के लिए है। तैयार कथनों का प्रयोग करें।
मिकमैकुसा

मैं सहमत हूं कि तैयार किए गए बयान सुरक्षा और विश्वसनीयता के लिए सोने के मानक हैं। मैं एक विशिष्ट मामले को उजागर कर रहा था जहां आप HTML के रूप में पाठ डेटा संग्रहीत करना चाह सकते हैं, इस मामले में मेरी पद्धति बाध्य मापदंडों का उपयोग करने के बजाय, इसके बजाय है। HTML में, HTML बाहर।
Grindlay
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.