Er "safe_eval" egentlig trygt?

stemmer
3

Jeg leter etter en sikker eval funksjon, for å gjennomføre regneark-lignende beregninger (med numpy / scipy).

Funksjonalitet for å gjøre dette ( rexec modul ) er fjernet fra Python siden 2.3 på grunn av tilsynelatende uløselige sikkerhetsproblemer. Det er flere tredjeparts hacks der ute som hensikt å gjøre dette - den mest gjennomtenkt løsning som jeg har funnet er denne Python Cookbok oppskriften , safe_eval.

Er jeg rimelig sikker på om jeg bruker denne (eller noe lignende), for å beskytte mot ondsinnet kode, eller er jeg stuck med å skrive min egen parser? Er det noen som vet om noen bedre alternativer?

EDIT: Jeg har nettopp oppdaget RestrictedPython , som er en del av Zope. Noen meninger om dette er velkomne.

Publisert på 26/08/2008 klokken 15:27
kilden bruker
På andre språk...                            


6 svar

stemmer
2

Skrive din egen parser kan være morsomt! Det kan være et bedre alternativ, fordi folk forventer å bruke det velkjente regneark syntaks (Excel, etc) og ikke Python når de går inn i formler. Jeg er ikke kjent med safe_eval men jeg vil tro at noe som dette absolutt har potensial for utnyttelse.

Svarte 26/08/2008 kl. 15:44
kilden bruker

stemmer
1

Hvis du bare trenger å skrive ned og lese noen datastruktur i Python, og ikke trenger den faktiske kapasiteten til å utføre egendefinert kode, er dette en bedre passform: http://code.activestate.com/recipes/364469-safe -eval /

Det garantees at ingen koden kjøres, bare statiske datastrukturer vurderes: strenger, lister, tupler, dictionnaries.

Svarte 02/08/2011 kl. 09:19
kilden bruker

stemmer
1

Avhenger av din definisjon av sikker jeg anta. Mye av sikkerhet avhenger av hva du passere inn og hva du har lov til å passere i sammenheng. For eksempel, hvis en fil er vedtatt i, kan jeg åpne vilkårlige filer:

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

Videre miljøet er meget begrenset (man kan ikke passere i moduler), og dermed kan ikke bare bestå i en modul av hjelpeprogramfunksjoner som re eller tilfeldig.

På den annen side, trenger du ikke å skrive din egen parser, kan du bare skrive din egen evaluator for python ast:

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

På den måten, forhåpentligvis, kan du implementere trygge import. Den andre tanken er å bruke Jython eller Ironpython og dra nytte av Java / Net Sandboxing evner.

Svarte 28/08/2008 kl. 11:35
kilden bruker

stemmer
1

Selv om den koden ser ganske sikker, har jeg alltid hatt den oppfatning at enhver tilstrekkelig motivert person kan bryte det gitt tilstrekkelig tid. Jeg tror det vil ta ganske mye vilje til å komme gjennom det, men jeg er relativt sikker på at det kunne gjøres.

Svarte 27/08/2008 kl. 02:37
kilden bruker

stemmer
0

Funksjonaliteten du ønsker er i kompilatoren språktjenester, se http://docs.python.org/library/language.html Hvis du definerer din app for å akseptere bare uttrykk, du kan kompilere innspill som et uttrykk og få et unntak hvis er det ikke, for eksempel hvis det er semikolon eller uttrykkene.

Svarte 06/01/2012 kl. 22:41
kilden bruker

stemmer
0

Daniel, Jinja implementerer en sandboxe miljø som kan eller ikke kan være nyttig for deg. Fra hva jeg husker, er det ikke ennå "forstå" liste oppfattelser.

SANbox info

Svarte 28/08/2008 kl. 10:12
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more