2012-06-29 5 views
8

Estoy empezando con Rails, así que estoy usando Brakeman para aprender sobre posibles vulnerabilidades en mi código de novato. Está lanzando una alta confianza "Dinámica Render Path" de advertencia sobre el código siguiente en mi archivo show.js.erb:Rails Advertencia de Brakeman: ¿Falsa alarma de ruta de renderizado dinámico?

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

realidad esperaba que esto era un problema, por lo que no hay sorpresa. Así que lo cambié a la siguiente:

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

Aunque creo que el código está ahora a salvo, Brakeman sigue siendo infeliz con esto. ¿Hay una forma más idiomática de controlar la representación de un parcial basado en la entrada del usuario?

Respuesta

7

Actualización (05/02/2016):

Esto se ha corregido a partir del Brakeman 3.0.3.

Si el método legal_partial? se colocarán en línea como esta:

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 será capaz de detectar la condición de guarda y ya no alertar sobre la tarde render llamada.


Respuesta original:

Desafortunadamente, Brakeman no sabe que es un if legal_partial? un protector adecuado. Todo lo que sabe es que params[:partial] está asignado a @allowed_partial, y que luego se pasa al render.

Usted puede ser capaz de decir que @allowed_partial siempre será un valor seguro. En ese punto, debe considerar si tiene sentido agregar complejidad para hacer que una herramienta sea feliz.

A modo de ejemplo, se puede hacer esto:

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 

Es básicamente lo mismo, excepto que ahora está ocultando la asignación de @allowed_partial de Brakeman.

(Advertencia:. No necesariamente "mejor" manera de hacer esto)

+0

Me parece que no puede obtener la condición de guarda a trabajar para los atributos del modelo. Tengo un método en mi modelo: 'def sanitized_partial_path; if ["foo", "bar"]. include? (atributo); "ruta/a/# {atributo}"; end; 'y todavía da el falso positivo. – Nick

+0

@Nick Brakeman no va a mirar el contenido de 'sanitized_partial_path' (aunque en el futuro Brakeman Pro lo hará). El ejemplo en mi respuesta funciona debido a la asignación a una variable de instancia en la acción del controlador que se utiliza más adelante en la vista. – Justin

Cuestiones relacionadas