Domanda

Sto cercando una "cassetta di sicurezza" funzione eval, per implementare foglio di calcolo (utilizzando numpy/scipy).

La funzionalità per fare questo (la rexec modulo) è stato rimosso da Python, poiché 2.3 debiti verso apparentemente insanabili problemi di sicurezza.Ci sono diversi di terze parti hack là fuori che pretendono di fare questo - più pensato soluzione che ho trovato è questo Python Cookbok ricetta, "safe_eval".

Sono ragionevolmente sicuro se io uso questo (o qualcosa di simile), per proteggersi dal malware, o sto bloccato con la scrittura di mio parser?Qualcuno sa di eventuali alternative migliori?

EDIT:Ho appena scoperto RestrictedPython, che è parte di Zope.Ogni opinione su questo sono benvenuti.

È stato utile?

Soluzione

Dipende dalla tua definizione di cassetta di sicurezza, suppongo.Un sacco di sicurezza dipende da cosa si passa e ciò che si è permesso di passare nel contesto.Per esempio, se un file viene passato, sono in grado di aprire file arbitrari:

>>> names['f'] = open('foo', 'w+')
>>> safe_eval.safe_eval("baz = type(f)('baz', 'w+')", names)
>>> names['baz']
<open file 'baz', mode 'w+' at 0x413da0>

Inoltre, l'ambiente è molto limitato (non è possibile passare in moduli), quindi non si può semplicemente passare un modulo di funzioni di utilità come re o casuale.

D'altra parte, non è necessario scrivere il proprio parser, si potrebbe semplicemente scrivere il proprio valutatore per il python ast:

>>> import compiler
>>> ast = compiler.parse("print 'Hello world!'")

In quel modo, si spera, si potrebbe attuare sicuro importazioni.L'altra idea è usare Jython o IronPython e approfittare di Java/.Net sandboxing capacità.

Altri suggerimenti

Iscritto il tuo parser potrebbe essere divertente!Potrebbe essere una scelta migliore, perché le persone si aspettano di utilizzare i fogli di calcolo familiare sintassi (Excel, ecc) e non di Python che stiamo per entrare in formule.Non ho familiarità con safe_eval, ma immagino che una cosa del genere ha certamente il potenziale per lo sfruttamento.

Anche se il codice sembra abbastanza sicuro, ho sempre avuto il parere che qualsiasi sufficientemente motivato persona potrebbe spezzare disporre di tempo sufficiente.Penso che ci vorrà un po ' di determinazione per ottenere attraverso, ma sono relativamente sicuro che si poteva fare.

Se avete semplicemente bisogno di scrivere e di leggere qualche struttura di dati in Python, e non è necessario l'effettiva capacità di esecuzione di codice personalizzato, questa è una misura migliore:http://code.activestate.com/recipes/364469-safe-eval/

Si garantisce che non venga eseguito il codice, solo statico di strutture di dati sono valutati:stringhe, liste, tuple, dictionnaries.

Daniel, Jinja implementa un sandboxe ambiente che può o non può essere utile a voi.Da quello che mi ricordo, non ancora "capire" list comprehensions.

Sanbox info

La funzionalità che si desidera è il compilatore di servizi linguistici, vedere http://docs.python.org/library/language.html Se si definisce l'app per accettare solo le espressioni, è possibile compilare l'ingresso, come espressione e ottenere un eccezione se non lo è, ad esempio,se ci sono punti e virgola o forme di istruzione.

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