2008-11-05 8 views
11

मैं ColdFusion में कोडिंग रहा हूँ, लेकिन cfscript में रहने के लिए कोशिश कर रहा है, तो मैं एक समारोह मुझे <cfquery blah > #query# </cfquery>ColdFusion अतिरिक्त उद्धरण जोड़ने जब तार में डेटाबेस प्रश्नों के निर्माण

किसी तरह से इसे चलाने के लिए एक प्रश्न में पारित करने के लिए अनुमति देता है कि है हालांकि, जब मैं sql = "SELECT * FROM a WHERE b='#c#'" के साथ अपने प्रश्नों का निर्माण करता हूं और इसे पास करता हूं, तो कोल्डफ्यूजन ने सिंगल कोट्स को 2 सिंगल कोट्स के साथ बदल दिया है। तो यह अंतिम क्वेरी में WHERE b=''c'' बन जाता है।

मैंने तारों को कई अलग-अलग तरीकों से बनाने की कोशिश की है, लेकिन मैं इसे केवल एक उद्धरण छोड़ने के लिए नहीं मिल सकता। एक स्ट्रिंग प्रतिस्थापन करने से भी कोई प्रभाव नहीं पड़ता है।

कोई विचार यह क्यों हो रहा है? यह इस परियोजना की अवधि के लिए cfscript में रहने की मेरी उम्मीदों को बर्बाद कर रहा है

उत्तर

17

डिज़ाइन द्वारा कोल्डफ्यूजन, <cfquery> टैग के भीतर चर को इंटरपोल करते समय सिंगल कोट्स से बच निकलता है।

जो भी आप चाहते हैं उसे करने के लिए, आपको PreserveSingleQuotes() फ़ंक्शन का उपयोग करने की आवश्यकता है।

<cfquery ...>#PreserveSingleQuotes(query)#</cfquery> 

हालांकि, यह एसक्यूएल इंजेक्शन का खतरा नहीं है, जिसके लिए आप स्वयं को उजागर कर रहे हैं।

<cfqueryparam> का उपयोग करके आपके डेटाबेस को क्वेरी को कैश करने की अनुमति मिलती है, जो ज्यादातर मामलों में प्रदर्शन में सुधार करेगी।

का उपयोग करने के लाभों के बारे में अधिक जानकारी के लिए an old Ben Forta column और a recent post by Brad Wood पढ़ने में मददगार हो सकता है।

4

ColdFusion स्वचालित रूप से <cfquery> टैग में एकल उद्धरण उद्धरण निकल जाता है जब आप निम्न सिंटैक्स का उपयोग:

SELECT * FROM TABLE WHERE Foo='#Foo#' 

मामले में आप #Foo# में एकल उद्धरण आप #PreserveSingleQuotes(Foo)# कॉल करना होगा संरक्षित करने के लिए चाहते हैं।

केवल फ़ंक्शन परिणामों के लिए नहीं, परिवर्तनीय मानों के लिए स्वत: भागने वाले कार्यों को अवगत रहें। ऑटो बचने बायपास करने के लिए एक समारोह परिणाम में बदलकर -

SELECT * FROM TABLE WHERE Foo='#LCase(Foo)#' /* Single quotes are retained! */ 

कि प्रकाश में, समारोह PreserveSingleQuotes() (Adobe LiveDocs देखें) मूल्य पर एक "नल ऑपरेशन" की तुलना में अधिक नहीं है।

6

अपने प्रश्न का उत्तर, के रूप में अन्य लोगों ने कहा, preserveSingleQuotes(...)

हालांकि, समाधान आप वास्तव में चाहते हैं, उपयोग कर रहा है गतिशील रूप से इस तरीक़े से अपने प्रश्नों के निर्माण के लिए नहीं है। यह बुरा बुरा बुरा है।

किसी भी आईएफएस/स्विच/आदि के रूप में उपयुक्त के साथ cfquery टैग के अंदर अपने एसक्यूएल रखो, और सुनिश्चित करें कि सभी सीएफ चर cfqueryparam टैग का उपयोग करें।

(ध्यान दें, यदि आप ORDER BY खंड में चर का उपयोग, आप मैन्युअल कोई भी चर से बचने के लिए की आवश्यकता होगी; cfqueryparam खंड द्वारा आदेश में उपयोग नहीं किया जा सकता है)

0

मैं डेव के जवाब को वोट किया है के बाद से मैंने सोचा था कि उसने अच्छा काम किया।

मैं तथापि जोड़ने के लिए वहाँ भी ColdFusion कि आम एसक्यूएल कार्यों के प्रदर्शन करने के लिए की संभावना हो का एक बहुत सरल बना सकते हैं के लिए बनाया गया कई अलग अलग उपकरण हैं कि चाहते हैं। वहाँ एक बहुत ही हल्के वजन मार्क मेंडल, Reactor जो मूल रूप से डौग ह्यूजेस द्वारा बनाया गया था और एक मैं DataFaucet बुलाया विकसित से DataMgr स्टीव ब्रायंट द्वारा लिखित बुलाया उपकरण, साथ ही Transfer है। इनमें से प्रत्येक की अपनी ताकत और कमजोरियां हैं। व्यक्तिगत रूप से मुझे लगता है कि आप डेटाफॉकेट पर विचार करने के लिए उपयुक्त हैं जो आपको विभिन्न प्रकार के प्रश्नों के निर्माण के लिए विभिन्न वाक्यविन्यासों के साथ, cfscript में रहने की सर्वोत्तम क्षमता प्रदान करेगा।

यहाँ कुछ उदाहरण हैं:

qry = datasource.select_avg_price_as_avgprice_from_products(); //(requires CF8) 

qry = datasource.select("avg(price) as avgprice","products"); 

qry = datasource.getSelect("avg(price) as avgprice","products").filter("categoryid",url.categoryid).execute(); 

qry = datasource.getSelect(table="products",orderby="productname").filter("categoryid",url.categoryid).execute(); 


ढांचा सुनिश्चित करता है कि cfqueryparam हमेशा एसक्यूएल इंजेक्शन के हमलों को रोकने के लिए इन फिल्टर बयानों के साथ प्रयोग किया जाता है, और वहाँ डालने, अद्यतन के लिए समान वाक्यविन्यास हैं और बयानों को नष्ट । (वहाँ simple rules to avoid sql-injection के एक जोड़े हैं।)

संबंधित मुद्दे