2010-06-09 6 views
30

मुझे एसक्यूएल क्वेरी का एक हिस्सा sanitize है। मैं ऐसा कुछ कर सकता हूं:रेल में एसक्यूएल टुकड़े को sanitize कैसे करें

class << ActiveRecord::Base 
    public :sanitize_sql 
end 

str = ActiveRecord::Base.sanitize_sql(["AND column1 = ?", "two's"], '') 

लेकिन यह सुरक्षित नहीं है क्योंकि मैं संरक्षित विधि का पर्दाफाश करता हूं। ऐसा करने का एक बेहतर तरीका क्या है?

+3

क्या आप हमें थोड़ा और संदर्भ दे सकते हैं? 'sanitize_sql' और मित्रों को अक्सर एआर :: बेस-व्युत्पन्न कक्षाओं के अंदर बुलाया जाता है, दृश्यता को बदलने की आवश्यकता के बिना – pilcrow

+0

यह एक अच्छा और वैध बिंदु है। जब मैं किसी के निजी या संरक्षित तरीकों का उपयोग करता हूं तो मैं बस क्रिंग करता हूं। – dimus

उत्तर

3

आप अप्रत्यक्ष रूप से लागू द्वारा विधि के protected सत्ता बायपास कर सकते हैं:

str = ActiveRecord::Base.__send__(:sanitize_sql, ["AND column1 = ?", "two's"], '') 

... जो कम से कम आप होने छोड़ूँगा public के रूप में है कि विधि refashion करने के लिए।

(मैं थोड़ा संदिग्ध कि आप वास्तव में ऐसा करने की जरूरत है, लेकिन इसके बाद के संस्करण में काम करेंगे हूँ।)

+0

एक उपयोग एसपीएल कमांड को फेसबुक एपीआई – lulalala

+17

पर भेजे जाने के लिए है जो विधियों की संरक्षित प्रकृति के आसपास जाने के लिए भेजने का एक बड़ा प्रशंसक नहीं है। – chug2k

13

ActiveRecord :: Base.connection.quote रेल 3.x में काम कर देता है

41

तुम बस का उपयोग कर सकते हैं:

ActiveRecord::Base::sanitize(string) 
+0

रेल के लिए काम करता है 2.3.8 – MrYoshiji

+9

यह प्रतिनिधि 'ActiveRecord :: Base.connection.quote' (कम से कम रेल 4 में) –

+1

पर इस विधि को हटा दिया गया था [PR 26000] (https://github.com/rails/rails/पुल/26000) – Scudelletti

4

इस सवाल का जवाब ActiveRecord से आना है और न ही यह रेल का कौन सा संस्करण के लिए यह होना चाहिए निर्दिष्ट है कि निर्दिष्ट नहीं है। यही वजह है कि (और क्योंकि यह ऊपर और कुछ में से एक है) कैसे रेल में पैरामीटर को साफ़ करने में पर जवाब ...


यहाँ एक समाधान है कि रेल 4 के साथ काम करता है: आपके पास

ActiveRecord::Sanitization::ClassMethods में sanitize_sql_for_conditions और उसके दो अन्य उपनाम: sanitize_conditions और sanitize_sql। तीन सचमुच एक ही चीज़ करते हैं।

sanitize_sql_for_conditions

एक सरणी, हैश, या SQL स्थिति का स्ट्रिंग स्वीकार करता है और एक के लिए एक वैध एसक्यूएल टुकड़ा में sanitizes उन्हें कहां खंड

इसके अलावा ActiveRecord में आप

sanitize_sql_for_assignment जो

एक सरणी, हैश, या SQL स्थिति का स्ट्रिंग स्वीकार करता है और एक सेट खंड के लिए एक वैध एसक्यूएल टुकड़ा में उन्हें sanitizes है।

  • तरीकों से ऊपर ActiveRecord में शामिल हैं :: डिफ़ॉल्ट रूप से बेस और इसलिए किसी भी ActiveRecord मॉडल में शामिल हैं।

इसके अलावा, हालांकि, ActionController में आप ActionController::Parameters जो आप

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

params = ActionController::Parameters.new(user: { name: 'Bryan', age: 21 }) 
req  = params.require(:user) # will throw exception if user not present 
opt  = params.permit(:name)  # name parameter is optional, returns nil if not present 
user = params.require(:user).permit(:name, :age) # user hash is required while `name` and `age` keys are optional 

"पैरामीटर जादू" सशक्त पैरामीटर (docs here) कहा जाता है और आपको लगता है कि उपयोग कर सकते हैं यह एक मॉडल को भेजने से पहले एक नियंत्रक में पैरामीटर को साफ़ करने में।

  • उपरोक्त विधियों ActionController::Base में डिफ़ॉल्ट रूप से शामिल किए गए हैं और इसलिए किसी भी रेल नियंत्रक में शामिल हैं।

मुझे उम्मीद है कि केवल किसी को सीखने और रेल को नष्ट करने में मदद मिलेगी! :)

+0

क्या एसक्यूएल इंजेक्शन के खिलाफ 'आवश्यकता' और 'परमिट' सैनिटाइज पैरामीटर है, या बस उनकी उपस्थिति को मान्य करें? – Matt

+2

यह शून्य sanitizing करता है, बस उपस्थिति – Jimmy

+2

@ मैट मान्य करता है: जिमी सही है, 'आवश्यकता' और 'परमिट' स्वयं द्वारा कोई sanitizing नहीं करते हैं। लेकिन 'एक्शन कंट्रोलर :: पैरामीटर.न्यू' स्वच्छता करता है, इसलिए आपके सभी नियंत्रक पहले से ही सभी मानकों को स्वच्छ कर रहे हैं। जब मेरे पास समय होता है तो मैं अपना जवाब बाद में अपडेट कर दूंगा क्योंकि मुझे रेल-एचटीएमएल-सैनिटाइजर https://github.com/rails/rails-html-sanitizer –

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