Wie markieren Sie ein Ruby-Bindung als vertrauenswürdig?
-
26-09-2019 - |
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?
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 .