2013-06-11 8 views
5

Mi piace l'idea di "codice come dati" per la configurazione, perché la convalida ottenuta dalle classi del caso è la stessa convalida che si desidera per un file di configurazione. Twitter ha scritto una bella utility Eval che rende questo facile (https://github.com/twitter/util). Vorrei consentire agli utenti di caricare i file di configurazione su un servizio remoto. Questo apre il potenziale per iniettare codice contro il mio servizio remoto.Come si può forzare Scala Eval di Twitter per prevenire l'iniezione di codice? Vorrei limitare Eval alla specifica dei parametri di configurazione

Per esempio, se ho la seguente classe caso config:

case class MyConfig(param1: String) 

vorrei che l'utente sia in grado di caricare un file contenente il comando:

MyConfig(param1 = "My Param Value") 

... ma non un file contenente il comando:

MyConfig(param1 = {import someDangerousPackage; someDangerousCommand(); "My Param Value"}) 

C'è un modo per intercettare la compilazione per assicurarsi che no vengono chiamate le funzioni?

+3

Se si dispone già delle classi case, perché non si utilizza semplicemente la configurazione tipesa per il file di configurazione e si estrae da lì? – drexin

+1

dare un'occhiata a http://code.google.com/p/scalascriptengine/ Penso che forniscano alcune opzioni di sicurezza di base – vitalii

+0

Se creo e convalido un'istanza della classe case utilizzando un file HOCON Config Typesafe, i miei numeri di linea potrebbero riflettere la classe di casi generata, non l'HOCON originale - a meno che non fraintenda l'approccio ... –

risposta

0

Le persone possono aggiungere codice pericoloso senza importare pacchetti; quante linee di codice servono per emettere un comando rm ...?

La soluzione migliore non è consentire alle persone di inviare il codice per la configurazione; basta usare un parser XML o simili. L'unica alternativa davvero sicura sarebbe quella di analizzare personalmente il caricamento e confrontarlo con una rigida whitelist di parole chiave (e stringhe tra virgolette) che possono utilizzare. A questo punto sei a metà strada per scrivere il tuo interprete e sei ancora vulnerabile a molti errori, quindi l'analisi dei file di testo inizia a sembrare l'opzione pigra e sicura.

+0

Grazie, Josiah. Ho finito per abbandonare Twitter Eval e andare con un DSL personalizzato usando Scala Parser Combinators. In realtà è più semplice dell'analisi di XML una volta superata la sintassi. –

+0

@ToddFlanders si prega di chiudere la domanda –