2011-04-05 10 views
8

मैं क्लाइंट के एप्लिकेशन में कुछ बड़े असाइनमेंट भेद्यता को ठीक कर रहा हूं और मैं यह सुनिश्चित करना चाहता हूं कि रेल चुपचाप संरक्षित विशेषताओं को असाइन करने के प्रयासों को चुपचाप छोड़ नहीं रहा है। इसके बजाय, मैं एक अपवाद फेंकना चाहता हूं ताकि मैं जांच कर सकूं।किसी भी अपवाद को फेंक दें जब कोई संरक्षित गुणों को बड़े पैमाने पर असाइन करने का प्रयास करता है

Ie, जब भी यह सामान्य रूप से लॉग में दिखाई देगा:

WARNING: Can't mass-assign these protected attributes: ... 

मैं (या अतिरिक्त) के बजाय एक अपवाद फेंक

संपादित करना चाहते हैं: मैं रेल 2.3 उपयोग कर रहा हूँ .4

उत्तर

10

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

module ActiveModel 
    module MassAssignmentSecurity 
    module Sanitizer 
    protected 
     def warn!(attrs) 
     self.logger.debug "WARNING: Can't mass-assign protected attributes: #{attrs.join(', ')}" if self.logger 
     raise(RuntimeError, "Mass assignment error") if ['test', 'development'].include?(Rails.env) 
     end 
    end 
    end 
end 

यह नियमित चेतावनी बढ़ा देंगे, लेकिन यह भी संदेश "मास काम त्रुटि" जब परीक्षण और विकास के वातावरण में किसी भी समय की रक्षा की विशेषताओं बड़े पैमाने पर सौंपा हैं के साथ एक RuntimeError बढ़ा देंगे: मैं config/initializers/error_mass_assign.rb के लिए निम्न जोड़ना होगा । यदि आप एक और अपवाद पसंद करते हैं तो आप ऊपर दिए गए कोड में त्रुटि संदेश या त्रुटि को भी संशोधित कर सकते हैं।

इसके लिए प्रभावी होने के लिए अपने कंसोल या सर्वर को पुनरारंभ करना सुनिश्चित करें।

पी.एस:

module ActiveRecord 
    class Base 
    def log_protected_attribute_removal(*attributes) 
     logger.debug "WARNING: Can't mass-assign these protected attributes: #{attributes.join(', ')}" 
     raise(RuntimeError, "Mass assignment error") 
    end 
    end 
end 
+1

क्यों नहीं है मैं उत्पादन में ऐसा करना चाहते हैं: रेल 2 में आप निम्न कार्य करना चाहते हैं? हां, यदि कोई उपयोगकर्ता बड़े पैमाने पर असाइन करने का प्रयास करता है, तो वह या तो नियमों के खिलाफ कुछ करने की कोशिश कर रहा है (जिस स्थिति में उसका अनुरोध उड़ाया जाता है) या मैं एक विशेषता सुलभ बनाने के लिए भूल गया हूं (जिस स्थिति में मैं जानना चाहता हूं इसके बारे में)। –

+0

इसके अलावा, और प्रश्न में उल्लेख करने के लिए खेद है, लेकिन मैं रेल 2.3.4 का उपयोग कर रहा हूं। रेल के मेरे संस्करण में काम करने के लिए आपके जवाब में मुझे क्या परिवर्तन करना चाहिए? –

+0

यदि आप ऐसा करते हैं तो यह ठीक है, आप केवल त्रुटि को पकड़ना और उचित तरीके से इसे संभालना चाहते हैं, आप अपने उपयोगकर्ता को 500 त्रुटि पृष्ठों और कोई स्पष्टीकरण नहीं छोड़ना चाहते हैं। उदाहरण के लिए, यदि उपयोगकर्ता आपकी साइट को हैक करने का प्रयास कर रहा है तो आपको ऐसा होने पर शायद अधिसूचित किया जाना चाहिए, और यदि आप एक विशेषता को सुलभ के रूप में सेट करना भूल गए हैं, तो आपको कुछ ठीक करने की आवश्यकता है। –

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