2012-06-29 11 views
8

मैं बस रेल के साथ शुरू कर रहा हूं, इसलिए मैं अपने न्यूबी कोड में संभावित भेद्यता के बारे में जानने के लिए Brakeman का उपयोग कर रहा हूं। यह उच्च-विश्वास "गतिशील प्रस्तुत पथ" मेरी show.js.erb फ़ाइल में निम्न कोड के बारे में चेतावनी फेंक रहा है:रेल ब्रैकमन चेतावनी: गतिशील रेंडर पथ झूठा अलार्म?

$('#media-fragment').html('<%= escape_javascript(render(params[:partial])) %>'); 

मैं वास्तव में उम्मीद यह एक समस्या थी, इसलिए कोई आश्चर्य की बात है कि वहाँ। इसलिए मैं यह निम्नलिखित के लिए बदल दिया:

# controller: 
    def show 
    if legal_partial? 
     @allowed_partial = params[:partial] 
    else 
     raise StandardError, "unexpected partial request: #{params[:partial]}" 
    end 
    end 

    private 

    def legal_partial? 
    %w(screenshots video updates).include? params[:partial] 
    end 

    # ... 
    # show.js.erb 
    $('#media-fragment').html('<%= escape_javascript(render(@allowed_partial)) %>'); 

हालांकि मेरा मानना ​​है कि कोड, अब सुरक्षित है brakeman अभी भी इस से नाखुश है। क्या उपयोगकर्ता इनपुट के आधार पर आंशिक प्रतिपादन को नियंत्रित करने के लिए एक और अधिक मूर्ख तरीका है?

उत्तर

7

अद्यतन (2016/02/05):

यह brakeman 3.0.3 के रूप में निर्धारित किया गया है। legal_partial? विधि इस तरह inlined है

हैं:

def show 
    if %w(screenshots video updates).include? params[:partial] 
    @allowed_partial = params[:partial] 
    else 
    raise StandardError, "unexpected partial request: #{params[:partial]}" 
    end 
end 

brakeman गार्ड हालत का पता लगाने के लिए सक्षम हो जाएगा और अब बाद में render कॉल के बारे में चेतावनी देगा।


मूल जवाब:

दुर्भाग्य से, brakeman नहीं जानता है कि if legal_partial? एक उचित गार्ड है। यह सब जानता है कि params[:partial] को @allowed_partial पर असाइन किया गया है, और उसके बाद render पर भेजा गया है।

आप यह बता सकते हैं कि @allowed_partial हमेशा एक सुरक्षित मूल्य होगा। उस बिंदु पर, आपको यह समझना होगा कि टूल को खुश करने के लिए जटिलता जोड़ने के लिए यह समझ में आता है या नहीं। अब आप brakeman से @allowed_partial का काम छुपा रहे हैं को छोड़कर

def show 
    render_allowed_partial params[:partial] 
end 

def render_allowed_partial name 
    if %w(screenshots video updates).include? name 
    @allowed_partial = name 
    else 
    raise StandardError, "unexpected partial request: #{params[:partial]}" 
    end 
end 

यह मूल रूप से एक ही बात है,:

बस एक उदाहरण के रूप में, आप यह कर सकता है।

(चेतावनी:। नहीं जरूरी "सर्वश्रेष्ठ" ऐसा करने का तरीका)

+0

मैं मॉडल विशेषताओं के लिए काम करने के लिए गार्ड हालत प्राप्त नहीं कर पा रहे। मेरे पास मेरे मॉडल पर एक विधि है: 'def sanitized_partial_path; अगर ["foo", "bar"] शामिल हैं? (विशेषता); "Path/to/# {विशेषता}"; अंत; 'और यह अभी भी झूठी सकारात्मक देता है। – Nick

+0

@ निक ब्रैकमैन 'sanitized_partial_path' की सामग्री को देखने वाला नहीं है (हालांकि भविष्य में ब्रैकमेन प्रो इच्छा)। मेरे उत्तर में उदाहरण नियंत्रक क्रिया में एक आवृत्ति चर के असाइनमेंट के कारण काम करता है जिसे बाद में उपयोग में उपयोग किया जाता है। – Justin

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