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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top