2009-06-02 14 views
5

में एसक्यूएल स्वच्छता को ओवरराइड करने के लिए मेरे पास पुराने कोल्डफ्यूजन कोड का एक गुच्छा साफ करने का दुर्भाग्यपूर्ण कार्य है। प्रश्नोत्तरी पूरी जगह पर हैं, मैं उन्हें आसान रखरखाव के लिए सभी सामान्य सीएफसी में ले जाने पर काम कर रहा हूं।कोल्डफ्यूजन

मैं एक समस्या में भाग रहा हूं क्योंकि cfquery स्वचालित रूप से सिंगल कोट्स को डबल-सिंगल-कोट्स में परिवर्तित कर रहा है। मैं उस व्यवहार को कैसे ओवरराइड कर सकता हूं?

अधिक विशिष्ट जानकारी नीचे दी गई है।


तो यहाँ

क्वेरी मैं के साथ शुरू किया है:

<cfquery name="getObjectInfo" datasource="#BaseDS#"> 
    SELECT groupName AS lastname, '[Group]' AS firstname 
    FROM groups 
    WHERE groups.group_id = #objectreference_id# 
</cfquery> 

यहाँ अजीब बात यह है कि एक शाब्दिक क्योंकि जिस तरह से हम चाहते हैं कि उसे दिखाया गया है (फिर से "चयनित" किया जा रहा है, मैं नहीं था यह मत लिखो, मैं बस इसे थोड़ा साफ करने की कोशिश कर रहा हूं)।

<cffunction name="fSelGroup" access="public" returntype="query" 
       hint="Returns query selecting given group."> 

    <cfargument name="intGroupID" type="numeric" required="true" 
       hint="ID of group to be returned." /> 
    <cfargument name="strSelectAttributes" type="string" required="false" 
       hint="Attributes to be selected in query" 
       default="*" /> 

    <cfquery name="getObjectInfo" datasource="#Application.DataSource#"> 
     SELECT #Arguments.strSelectAttributes# 
     FROM Groups 
     WHERE Group_ID = #Arguments.intGroupID# 
    </cfquery> 

    <cfreturn getObjectInfo /> 

    </cffunction> 

यहाँ है समस्या:: तो आम समारोह में, वहाँ का चयन खंड के लिए एक वैकल्पिक पैरामीटर है जब मैं strSelectAttributes पैरामीटर के लिए "GroupName AS LastName, '[Group]' AS FirstName" में पारित, क्वेरी डेटाबेस के लिए भेजा जाता है जो:

SELECT GroupName AS LastName, ''[Group]'' AS FirstName 
FROM Groups 
WHERE Group_ID = 4 

आप देखते हैं, मेरे उद्धरणों को एक अवैध क्वेरी में "sanitized" मिला।

+0

http: // stackoverflow भी देखें।कॉम/प्रश्न/266586/ठंडाफ्यूजन-जोड़-अतिरिक्त-उद्धरण-निर्माण-डेटाबेस-क्वेरी-इन-स्ट्रिंग्स – ale

उत्तर

17

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

SELECT #Arguments.strSelectAttributes# 

यह आमतौर पर एक सहायक चीज है और एसक्यूएल इंजेक्शन हमलों के खिलाफ रक्षा की एक छोटी सी पंक्ति है। तो नियम संख्या एक है (यहां और हर जगह): चर से अपनी एसक्यूएल स्ट्रिंग का निर्माण न करें।

SELECT #PreserveSingleQuotes(Arguments.strSelectAttributes)# 

इस समारोह ऑटो बचने एकल उद्धरण से ColdFusion बंद हो जाता है:

आप सकारात्मक लिए उपयोग चर सभी संभव नकारात्मक प्रभावों के बावजूद, एक SQL स्ट्रिंग बनाने की कोई आवश्यकता हैं, PreserveSingleQuotes() समारोह का उपयोग करें।

और कोई अन्य फ़ंक्शन कॉल वैसे ही वही काम करता है। प्रयास करें:

SELECT #LCase(Arguments.strSelectAttributes)# 

जिसका अर्थ है कि PreserveSingleQuotes() वास्तव में सिर्फ एक नहीं-op कि एक समारोह परिणाम में एक स्ट्रिंग बदल जाता है, ऐसा होने से स्वत: चर प्रक्षेप दिनचर्या को रोकने है।

+0

+1 बहुत अच्छा पता है। –

7

अपने चर के चारों ओर SingleQuotes() को संरक्षित करने के लिए एक कॉल दें। यह विशेष रूप से गतिशील एसक्यूएल लिखने के लिए बनाया गया है। साथ ही, आपको वास्तव में, वास्तव में अपने मूल्यों के लिए cfqueryparam का उपयोग करना चाहिए, और मुझे आशा है कि आप किसी भी तरह से अपने इनपुट को स्वच्छ कर रहे हैं ताकि arguments.strSlectAttributes में कुछ नहीं हो; 'ड्रॉप टेबल समूह; इस में।

<cfquery name="getObjectInfo" datasource="#Application.DataSource#"> 
    SELECT #preserveSingleQuotes(Arguments.strSelectAttributes)# 
    FROM Groups 
    WHERE Group_ID = <cfqueryparam value="#Arguments.intGroupID#" cfsqltype="cf_sql_integer"/> 
</cfquery> 
+0

धन्यवाद। मुझे एसक्यूएल इंजेक्शन के बारे में पता है, लेकिन मेरे मामले में पैरामीटर केवल उस कोड से आ रहा है जिसे हम नियंत्रित करते हैं, कभी भी उपयोगकर्ता से नहीं। – Kip

+4

मैं इसका उपयोग नहीं करता "यह केवल कोड द्वारा नियंत्रित होता है जिसे हम नियंत्रित करते हैं" एक डीएओ कक्षा लिखने के औचित्य के रूप में जो अन्यथा एसक्यूएल इंजेक्शन के लिए कमजोर है। –

+1

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

-3

तुम सच में कोड दो कदम को साफ करने के लिए इच्छुक हैं कि संग्रहित प्रक्रियाओं में स्पेगेटी परिवर्तित।