Είναι «safe_eval» πραγματικά ασφαλές;

ψήφοι
3

Ψάχνω για μια «ασφαλή» λειτουργία eval, να εφαρμόσουν τους υπολογισμούς υπολογιστικό φύλλο-όπως (χρησιμοποιώντας NumPy / SciPy).

Η λειτουργικότητα να το κάνετε αυτό (το rexec ενότητα ) έχει αφαιρεθεί από την Python από το 2.3 λόγω προφανώς unfixable προβλήματα ασφάλειας. Υπάρχουν πολλές αμυχές από τρίτους εκεί έξω που ισχυρίζονται για να γίνει αυτό - η πιο μελετημένη λύση που έχω βρει είναι αυτή η συνταγή Python Cookbok , «safe_eval».

Είμαι αρκετά ασφαλές αν μπορώ να χρησιμοποιήσω αυτή (ή κάτι παρόμοιο), για την προστασία από κακόβουλο κώδικα, ή είμαι κολλημένος με το να γράφει τη δική μου αναλυτή; Ξέρει κανείς από τις καλύτερες εναλλακτικές λύσεις;

EDIT: Μόλις ανακάλυψα RestrictedPython , η οποία αποτελεί μέρος του Zope. Οποιεσδήποτε απόψεις για αυτό είναι ευπρόσδεκτα.

Δημοσιεύθηκε 26/08/2008 στις 14:27
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
2

Γράφοντας το δικό σας πρόγραμμα ανάλυσης θα μπορούσε να είναι διασκέδαση! Θα μπορούσε να είναι μια καλύτερη επιλογή επειδή οι άνθρωποι αναμένουν να χρησιμοποιήσουν το γνωστό σύνταξη λογιστικών φύλλων (Excel, κλπ) και όχι Python όταν είναι είσοδό τους τύπους. Δεν είμαι εξοικειωμένος με safe_eval αλλά θα ήθελα να φανταστώ ότι κάτι τέτοιο σίγουρα έχει τη δυνατότητα για εκμετάλλευση.

Απαντήθηκε 26/08/2008 στις 14:44
πηγή χρήστη

ψήφοι
1

Παρά το γεγονός ότι ο κώδικας φαίνεται αρκετά ασφαλές, έχω κρατήσει πάντα την άποψη ότι κάθε πρόσωπο επαρκή κίνητρα θα μπορούσε να σπάσει δοθεί επαρκής χρόνος. Νομίζω ότι θα πάρει αρκετή αποφασιστικότητα για να πάρει μέσα από αυτό, αλλά είμαι σχετικά σίγουρος ότι θα μπορούσε να γίνει.

Απαντήθηκε 27/08/2008 στις 01:37
πηγή χρήστη

ψήφοι
0

Δανιήλ, Jinja υλοποιεί ένα sandboxe περιβάλλον που μπορεί ή δεν μπορεί να είναι χρήσιμο σε εσάς. Από ό, τι θυμάμαι, δεν έχει ακόμα «κατανοήσει» λίστα Η κατανόηση.

πληροφορίες Sanbox

Απαντήθηκε 28/08/2008 στις 09:12
πηγή χρήστη

ψήφοι
1

Εξαρτάται από το δικό σας ορισμό του ασφαλούς υποθέτω. Ένα μεγάλο μέρος της ασφάλειας εξαρτάται από το τι περνάτε μέσα και τι επιτρέπεται να περάσουν στο πλαίσιο. Για παράδειγμα, εάν ένα αρχείο έχει περάσει στο, μπορώ να ανοίξει αυθαίρετα αρχεία:

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

Επιπλέον, το περιβάλλον είναι πολύ περιορισμένη (που δεν μπορούν να περάσουν σε modules), έτσι, δεν μπορείτε απλά να περάσει σε μια ενότητα των λειτουργιών βοηθητικό πρόγραμμα, όπως εκ νέου ή τυχαία.

Από την άλλη πλευρά, δεν χρειάζεται να γράψετε τη δική σας αναλυτή, θα μπορούσατε απλά να γράψετε τη δική σας αξιολογητή για την AST python:

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

Με αυτόν τον τρόπο, ελπίζουμε, θα μπορούσατε να εφαρμόσουν ασφαλείς εισαγωγές. Η άλλη ιδέα είναι να χρησιμοποιήσετε Jython ή IronPython και να επωφεληθούν από τις δυνατότητες φιλτράρισμα Java / .Net.

Απαντήθηκε 28/08/2008 στις 10:35
πηγή χρήστη

ψήφοι
1

Αν απλά πρέπει να γράψετε και να διαβάσετε κάποια δομή δεδομένων στην Python, και δεν χρειάζεται την πραγματική ικανότητα εκτέλεσης προσαρμοσμένου κώδικα, αυτό είναι μια καλύτερη τακτοποίηση: http://code.activestate.com/recipes/364469-safe -eval /

Αυτό εγγυάται τη σωστή ότι δεν κώδικας εκτελείται, μόνο αξιολογούνται στατικές δομές δεδομένων: χορδές, λίστες, πλειάδες, dictionnaries.

Απαντήθηκε 02/08/2011 στις 08:19
πηγή χρήστη

ψήφοι
0

Η λειτουργικότητα που θέλετε είναι στην γλώσσα compiler υπηρεσίες, δείτε http://docs.python.org/library/language.html Αν ορίσετε η εφαρμογή σας να δέχεται μόνο τις εκφράσεις, μπορείτε να συγκεντρώσετε την είσοδο ως έκφραση και να πάρετε μια εξαίρεση, εάν δεν είναι, για παράδειγμα αν υπάρχουν ερωτηματικά ή έντυπα δήλωσης.

Απαντήθηκε 06/01/2012 στις 20:41
πηγή χρήστη

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