Come si contrassegna un rubino Binding come attendibile?
-
26-09-2019 - |
Domanda
Da questo articolo http://www.stuartellis.eu/articles/erb riferimento alla livelli di sicurezza filo:
"A questo livello, il legame specificato deve essere contrassegnato come attendibile per ERB usarlo."
Ho cercato di alta e bassa e non hanno trovato un modo per "marchio" di un'associazione come "di fiducia".
Qualcuno si prega di illuminarmi?
Soluzione
Si dovrebbe macchia l'associazione chiamando il metodo taint
.
I livelli $SAFE
sono una caratteristica di Ruby che nega determinate azioni in base al livello attuale e se un oggetto è contaminato . stringhe Tainted si presume provenire da una fonte non attendibile, ad esempio un file, un database, un client HTTP, ecc.
A livello $SAFE
1, per esempio, Ruby non ti consentono di file require
se l'argomento è una stringa contaminato.
livello $SAFE
4 è la più estrema. Ruby in modo efficace non consentire di modificare qualsiasi oggetto nontained. L'idea è che si può utilizzare un livello inferiore $SAFE
nell'applicazione, e un'istanza di un thread o proc con il livello $SAFE
4. All'interno di questo sandbox , è possibile modificare contaminato solo oggetti .
ERB utilizza questo meccanismo per consentire di eseguire un modello all'interno di una sandbox. Se si tenta di ottenere il risultato di un modello reso da un certo vincolante, questo è ciò che accade:
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! Questo è di Ruby che ti dice che si tratta di non va bene per modificare un nontainted oggetto a livello $SAFE
4. Non vi permetterà di chiamare eval
con il dato vincolante (che è esattamente ciò che i tentativi ERB).
Invece, si dovrebbe fornire la sandbox con un contaminato di legame. Stai dicendo esplicitamente di Ruby che è bene utilizzare questo legame in una sandbox, e che non dovrebbe essere attendibile al di fuori della sandbox.
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!"
Per ulteriori informazioni su livello $SAFE
di Ruby, vedi il eccellente descrizione nel libro Piccone .