Frage

Von diesem Artikel http://www.stuartellis.eu/articles/erb Bezug auf Gewinde Sicherheitsstufen:

„Auf dieser Ebene muss die angegebene Bindung markiert werden als vertrauenswürdig für ERB es zu benutzen.“

Ich habe gesucht hoch und niedrig und haben nicht gefunden, einen Weg zu „markieren“ eine Bindung als „vertrauenswürdig“.

Will jemand bitte mich aufklären?

War es hilfreich?

Lösung

Sie sollten taint die Bindung durch die taint Methode aufrufen.

Die $SAFE Ebene sind ein Feature von Ruby, die in Abhängigkeit von der aktuellen Ebene bestimmte Aktionen verweigert und ob ein Objekt verdorben . Tainted Strings wird angenommen von einer nicht vertrauenswürdigen Quelle stammt, wie beispielsweise eine Datei, eine Datenbank, ein HTTP-Client, etc.

Auf $SAFE Ebene 1, zum Beispiel, wird Rubin nicht zulassen, dass Sie require Dateien, wenn das Argument eine verdorbene Zeichenfolge ist.

$SAFE Stufe 4 ist das extremste. Ruby Sie effektiv nicht zuzulassen, zu ändern, dass nontained Objekt. Die Idee ist, dass Sie eine niedrigere $SAFE Ebene in Ihrer Anwendung verwenden können, und einen Thread oder proc mit $SAFE Ebene instanziiert 4. Innerhalb dieser Sandbox können Sie ändern verdorben nur Objekte .

ERB verwendet diesen Mechanismus, damit Sie eine Vorlage innerhalb einer Sandbox auszuführen. Wenn Sie versuchen, das Ergebnis einer gerenderten Vorlage von einer bestimmten zu bekommen Bindung, das ist, was passiert:

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! Dies ist Rubin Sie sagen, dass es nicht in Ordnung, ein ändern ohne taint Objekt auf $SAFE Ebene 4. Es wird Ihnen nicht erlauben, eval mit dem angegebenen anrufen Bindung (das ist genau das, was ERB Versuche).

Stattdessen sollten Sie die Sandbox mit einem bieten verdorben zu binden. Du Rubin ausdrücklich zu sagen, dass es okay ist, diese Bindung in einer Sandbox zu verwenden, und dass es nicht außerhalb der Sandbox vertraut werden soll.

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!"

Weitere Informationen über Rubys $SAFE Ebene finden Sie in der ausgezeichnete Beschreibung im Pickaxe Buch .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top