कैसे? पैरामीटर और LIKE स्टेटमेंट SQL


80

मैं एक खोज फ़ंक्शन लिख रहा हूं, और इस क्वेरी को रोकने, या कम से कम सीमा, SQL इंजेक्शन के हमलों का उपयोग करने वाले मापदंडों का उपयोग करने के बारे में सोचा है। हालाँकि, जब मैं इसे अपने कार्यक्रम के माध्यम से चलाता हूँ तो यह कुछ भी वापस नहीं करता है:

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

क्या मापदंडों का उपयोग इस तरह किया जा सकता है? या वे केवल एक उदाहरण में मान्य हैं:

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%'(जहां <string>खोज वस्तु है)।

संपादित करें: मैं VB.NET के साथ इस फ़ंक्शन का निर्माण कर रहा हूं, क्या आपके द्वारा योगदान किए गए वाक्यविन्यास पर प्रभाव पड़ता है?

साथ ही, मैंने SQL सर्वर में इस कथन को चलाया: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE% अधिकतम% ') `और वह परिणाम देता है।

जवाबों:


78

आपका विज़ुअल बेसिक कोड कुछ इस तरह दिखाई देगा:

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')")

cmd.Parameters.Add("@query", searchString)

3
जैसा कि एडम ने अपने जवाब में कहा है, यह SQL इंजेक्शन से रक्षा नहीं करता है। क्वेरी को मानकीकृत किया जाना चाहिए।
DOK

6
क्या आप एक उदाहरण प्रदान कर सकते हैं जहां यह SQL इंजेक्शन के खिलाफ नहीं रोकता है? मेरे परीक्षण से यह ठीक काम करता है
जॉन

27
यह SQLइंजेक्शन के लिए खुला नहीं है , सिर्फ LIKEइंजेक्शन है। इसका मतलब है कि उपयोगकर्ता विशेष वर्णों में प्रवेश कर सकता है जैसे कि % ^और _जो LIKEविशेष रूप से व्याख्या करेगा। इसका मतलब यह है कि उपयोगकर्ता को कुछ खोजों के लिए उम्मीद नहीं मिल सकती है। एक उदाहरण के रूप में, एक खोज 'less than 1% fat'परिणाम वापस कर सकती है 'less than 1% of doctors recommend this - it's full of fat!'
एलेक्स हम्फ्री

1
मैं सहमत हूं, जैसे "लाइक इंजेक्शन" के अधीन है और नुकसान केवल उपयोगकर्ता को नहीं मिल रहा है जो वे उम्मीद करते हैं। पैरामीटर किए जाने पर भी हर समय क्वेरी स्वच्छता का प्रदर्शन किया जाना चाहिए। उस सुरक्षा पर भरोसा करना बिल्कुल सुरक्षित नहीं है।
एंथनी मेसन

1
मैं यह भी करने की सलाह searchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]")दूंगा, जो कि LIKE इंजेक्शन (जब तक आप एस्केप क्लॉज का उपयोग नहीं कर रहे हैं) को अवॉइड कर देंगे।
8DX

114

खैर, मैं इसके साथ जाना चाहता हूँ:

 Dim cmd as New SqlCommand(
 "SELECT * FROM compliance_corner"_
  + " WHERE (body LIKE @query )"_ 
  + " OR (title LIKE @query)")

 cmd.Parameters.Add("@query", "%" +searchString +"%")

यह सही है, जॉन द्वारा प्रदान किए गए स्वीकृत उत्तर में गलत सिंटैक्स है!
एडम

3
मैं अनिश्चित हूं कि उसका सिंटैक्स गलत कैसे है, उसका समाधान ठीक काम करता है। मेरे पास एक फ़ंक्शन है जो एक datatable या किसी अन्य में उपयोग के लिए SQL स्टेटमेंट का निर्माण और रिटर्न करता है।
एंडर्स

1
अतिरिक्त नोट: MySQLDataAdapter = da = new MySQLDataAdapter ("SELECT * FROM tableA WHERE फ़ील्ड = @fieldA" का उपयोग करके C # के लिए सिंटैक्स; da.SelectCommand.Parameters.AddWithValue ("@ फ़ील्डए", "%" + someValue + "%");
जॉन एम

3
अन्य उत्तर (जॉन से) भी काम करता है, लेकिन वास्तव में इंजेक्शन की तरह कमजोर है, जो आपके क्षेत्र के उद्देश्य के आधार पर अजीब परिणाम देता है।
स्टीवन लेमेंस

1
नहीं होना चाहिए cmd.Parameters.Addहो जाता है cmdLoad.Parameters.AddWithValueया कोई मुद्दा है? मैं समझता हूं कि जेम्स का जवाब 2008 :)
WTFZane


2

आपको अपने पैरामीटर के साथ% संकेतों को संक्षिप्त करना पड़ सकता है, जैसे:

LIKE '%' || @query || '%'

संपादित करें: वास्तव में, इसका कोई मतलब नहीं हो सकता है। मुझे लगता है कि मैंने आपकी समस्या को गलत समझा हो सकता है।


1

कभी-कभी एक प्लेसहोल्डर के रूप में उपयोग किया जाने वाला प्रतीक %वैसा नहीं होता है यदि आप VB से किसी क्वेरी को निष्पादित करते हैं जैसे कि आप इसे MS SQL / Access से निष्पादित करते हैं। से अपने प्लेसहोल्डर प्रतीक बदलने का प्रयास करें %करने के लिए *। वह काम कर सकता है।
हालाँकि, यदि आप डिबग करते हैं और अपने SQL स्ट्रिंग को सीधे MS SQL या Access में कॉपी करना चाहते हैं, तो इसका परीक्षण करने के लिए, आपको %वास्तव में मान वापस करने के लिए प्रतीक को MS SQL या Access में वापस बदलना पड़ सकता है ।

उम्मीद है की यह मदद करेगा


मुझे यकीन नहीं है कि 2012 में, लेकिन यह% बनाम * ADO बनाम DAO इंजन के लिए विशिष्ट है। यदि आप पहुँच में DAO, या करंट () का उपयोग कर रहे हैं तो वाइल्डकार्ड * है; अगर प्रवेश के अंदर VBA सहित किसी भी कोड से ADO का उपयोग किया जाता है, तो वाइल्डकार्ड% है।
Marcelo Scofano Diniz

1

इस तरह से भी आजमाएं

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%')  OR  title LIKE CONCAT('%',@query,'%') )")
cmd.Parameters.Add("@query", searchString)
cmd.ExecuteNonQuery()

इस्तेमाल किया कॉनैट + के बजाय

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.