2013-04-19 11 views
7

कुछ पृष्ठभूमि को लागू करने():सार्वजनिक कार्यों दूर से सुलभ हो जाते हैं जब onCFCRequest

मैं दूरस्थ सीएफसी नियमित CFM पृष्ठ अनुरोधों से अलग से कॉल को संभालने के लिए onCFCRequest() उपयोग कर रहा हूँ। यह मुझे सभी दूरस्थ अनुरोधों के लिए त्रुटियों को पकड़ने और एमआईएम प्रकारों को साफ करने की अनुमति देता है।

समस्या:

मैंने गलती remote के बजाय public उपयोग करने के लिए मेरे दूरस्थ सीएफसी कार्यों में से कुछ की स्थापना की और महसूस किया कि वे अभी भी जब दूर से कहा जाता है काम कर रहे थे।

आप नीचे देख सकते हैं, onCFCRequest() की मेरी कार्यान्वयन अपने पूरे आवेदन, जहां एक HTTP अनुरोध किसी HTTP-सुलभ सीएफसी पर किसी भी public विधि आह्वान करने के लिए इस्तेमाल किया जा सकता में एक भारी सुरक्षा छेद बनाया गया है।

REPRO कोड:

Application.cfc में:

public any function onCFCRequest(string cfc, string method, struct args){ 
     cfc = createObject('component', cfc); 
     return evaluate('cfc.#method#(argumentCollection=args)'); 
    } 

एक सीएफसी में दूर से कहा जाता है:

public any function publicFunction(){ 
     return 'Public function called remotely!'; 
    } 

प्रश्न:

मुझे पता है कि मैं यह सत्यापित करने के लिए विधि को आमंत्रित करने से पहले घटक के लिए मेटा डेटा देख सकता हूं कि यह दूरस्थ पहुंच की अनुमति देता है, लेकिन क्या मैं अन्य समस्याएं इस समस्या से संपर्क कर सकता हूं?

उत्तर

6

onCfcRequest() वास्तव में सुरक्षा छेद, आप आँख बंद करके अगर यह ऐसा करने से पहले उचित है देखने के लिए जाँच के बिना विधि चलाकर सुरक्षा छेद बनाने पैदा नहीं करता, मैं डर ;-)

(एनबी: मैं बिल्कुल वही चीज़ खो गया हूं, इसलिए मुझे नहीं जाना है @-)

तो - हाँ - आप विधि चलाने से पहले मेटाडेटा को जांचने की आवश्यकता है। जब आप इस हैंडलर का उपयोग करते हैं, तो यह जांच उन चीजों में से एक है जो सीएफ आपके पास वापस आने के लिए पास हो जाती है, और इसे स्पष्ट रूप से कार्यान्वित किया गया है (3039293 देखें)।

मैंने इस मुद्दे का विवरण और मेरे blog पर समाधान लिखा है। जैसा कि नीचे एक टिप्पणी में देखा गया है, मैं वहां कुछ कोड का उपयोग करता हूं - invoke() - जो केवल CF10 + पर काम करेगा, लेकिन सामान्य तकनीक वही रहती है।

+0

स्पष्ट रूप से यह मेरा कार्यान्वयन है कि यहां समस्या है। प्रत्येक रिमोट अनुरोध के लिए मेटाडेटा पर लूपिंग ऐसा लगता है जैसे यह बहुत महंगा ओवरहेड पेश करेगा। फ़ंक्शन मेटा डेटा किसी सरणी में होता है (इसे स्ट्रक्चर कुंजी से पकड़ने के लिए कोई शॉर्टकट नहीं), और यदि सीएफसी एक और सीएफसी बढ़ा रहा है, तो मुझे विरासत श्रृंखला जारी रखना होगा, खोजने के लिए प्रत्येक विधि को जांचना होगा (या नहीं मिला) सही एक। Blech। – imthepitts

+0

आपको सिर्फ यह जांचने की आवश्यकता है कि क्या कहा जा रहा तरीका दूरस्थ है या नहीं, निश्चित रूप से? मैं इस बारे में ब्लॉगिंग के बीच में हूं (प्रेरणा के लिए धन्यवाद)। जल्द ही लिंक के साथ मेरा जवाब अपडेट कर देगा (+ 1h, मुझे कल्पना है)। –

+0

@imthepitts अगर आप 'GetComponentMetaData()' का उपयोग करते हैं तो आपको कम ओवरहेड मिलता है (यह स्थैतिक है)।या वैकल्पिक रूप से, रिमोट विधियों का नामकरण करने का एक सम्मेलन चुनें, फिर आप विधि नाम में त्वरित जांच कर सकते हैं। – Henry

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