Pregunta

A partir de este artículo http://www.stuartellis.eu/articles/erb refiriéndose a los niveles de seguridad de rosca:

"A este nivel, la unión especificado debe ser marcado como de confianza para la ERB usarlo."

he buscado alta y baja y no han encontrado una forma de "marca" una unión como "de confianza".

por favor que alguien me ilumine?

¿Fue útil?

Solución

debe mancha la unión mediante una llamada al método taint.

Los niveles $SAFE son una característica de Ruby que niega ciertas acciones dependiendo del nivel actual y si un objeto es contaminada . cuerdas contaminados se supone que proceden de una fuente no confiable, como un archivo, una base de datos, un cliente HTTP, etc.

A nivel $SAFE 1, por ejemplo, Ruby no le permiten a los archivos require si el argumento es una cadena contaminada.

nivel $SAFE 4 es la más extrema. Ruby no permitirá efectivamente modificar cualquier objeto nontained. La idea es que se puede utilizar un nivel inferior $SAFE en su aplicación, y crear instancias de un hilo o proc con el nivel $SAFE 4. Dentro de este , puede modificar contaminada sólo objetos caja de arena .

ERB utiliza este mecanismo para permitir ejecutar una plantilla dentro de una caja de arena. Si se intenta obtener el resultado de una plantilla representan a partir de una cierta unión, esto es lo que sucede:

class TemplateContext
  def name; "Teflon Ted"; end
end

template_binding = TemplateContext.new.send(:binding)
ERB.new("Hi, <%= name %>!", 4).result(template_binding)

#=> SecurityError: Insecure: can't modify trusted binding

Blam! Este es rubí que le dice que es no está bien para modificar un nontainted a nivel de objeto $SAFE 4. No se permitirá llamar eval con lo dado vinculante (que es exactamente lo que los intentos ERB).

En su lugar, debe proporcionar la caja de arena con un contaminada vinculante. Usted está diciendo explícitamente Ruby que es apropiado el uso de esta unión en una caja de arena, y que no debe ser de confianza fuera del entorno limitado.

class TemplateContext
  def name; "Teflon Ted"; end
end

# Binding must be tainted!
template_binding = TemplateContext.new.send(:binding).taint
ERB.new("Hi, <%= name %>!", 4).result(template_binding)

#=> "Hi, Teflon Ted!"

Para obtener más información sobre el nivel $SAFE de Ruby, consulte la excelente descripción en el libro Pico .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top