2012-06-29 12 views
8

Sadece Rails ile çalışmaya başladım, bu yüzden yeni kullanıcı kodumdaki olası güvenlik açıklarını öğrenmek için Brakeman kullanıyorum. Yüksek güven benim show.js.erb dosyasında aşağıdaki kodu hakkında uyarı "Dinamik Yol Render" atıyor: Aslında hiçbir sürpriz var, bu bir sorun oldu beklenenRaylar Brakeman uyarı: Dinamik Render Path yanlış alarmı?

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

. Bu yüzden aşağıda olarak değiştirdim:

# 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)) %>'); 

ben kod, artık güvende olduğunu Brakeman hala bu mutsuz olduğuna inanıyoruz rağmen. Kullanıcı girişine dayalı kısmi renderlemeyi kontrol etmek için daha akılcı bir yol var mı?

cevap

7

Güncellemesi (2016/02/05):

Bu Brakeman 3.0.3 olarak düzeltilmiştir. legal_partial? yöntem böyle satır içi

ise:

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 bekçi durumu tespit etmek mümkün olacak ve artık daha sonra render çağrısı hakkında uyaracaktır.


Orjinal cevap:

Maalesef Brakeman if legal_partial? uygun bir bekçi olduğunu bilmiyor. Tüm bildiği, params[:partial]'un @allowed_partial'a atandığı ve daha sonra render'a iletildiğini bilir.

@allowed_partial'un her zaman güvenli bir değer olacağını söyleyebilirsiniz. Bu noktada, bir aracı mutlu etmek için karmaşıklık katmanın mantıklı olup olmadığını düşünmelisiniz.

Sadece bir örnek olarak, bu yapabilirdi:

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 

Temelde aynı şey, şimdi Brakeman dan @allowed_partial atama saklıyorsun hariç.

(Uyarı:. Bunu yapmanın zaman değil "en iyi" şekilde)

+0

manken niteliklerini için çalışmaya bekçi koşulunu almak gibi olamaz. Benim modelimde bir yöntem var: "def sanitized_partial_path; eğer ["foo", "bar"].? (öznitelik) içerirse; "/ Yol/# {nitelik}"; Son olarak '' ve hala yanlış pozitif verir. – Nick

+0

@Nick Brakeman, "sanitized_partial_path" içeriğine bakmayacak (gelecekte Brakeman Pro'nun iradesi olmasına rağmen). Cevabımdaki örnek, daha sonra görünümde kullanılan denetleyici eyleminde bir örnek değişkene atanması nedeniyle çalışır. – Justin

İlgili konular