Wie sicher ist die Expressionsbewertung mit eval?
Ich erstelle eine Website, auf der der Benutzer in der Lage sein muss, einen Ausdruck basierend auf dem Wert in DB-Tabellen auszuwerten, anstatt Tools wie Pyparsing usw. zu verwenden. Ich denke darüber nach, Python selbst zu verwenden, und habe eine Lösung gefunden was für meinen zweck ausreicht. Ich benutze grundsätzlich eval, um den Ausdruck zu bewerten und Globals mit empty zu diktieren__builtins__
damit auf nichts zugegriffen werden kann und ein Einheimischer Werte aus der Datenbank vorschreibt, kann ich, wenn der Benutzer einige Funktionen benötigt, diese auch übergeben, z.
import datetime
def today():
return datetime.datetime.now()
expression = """ first_name.lower() == "anurag" and today().year == 2010 """
print eval(expression, {'__builtins__':{}}, {'first_name':'Anurag', 'today':today})
Meine Frage ist also, wie sicher es wäre, ich habe drei Kriterien
Kann der Benutzer irgendwie auf den aktuellen Status meines Programms oder meiner Tabelle usw. zugreifen?Kann der Benutzer Zugriff auf Anrufe auf Betriebssystemebene haben?Kann der Benutzer mein System anhalten, indem er eine Schleife durchführt oder viel Speicher verwendet, z. Wenn er den Bereich (10 * 8) ausführt, kann er in einigen Fällen beispielsweise 100 ** 1000 usw., so dass 3 kein so großes Problem darstellt. Ich kann eine solche Operation mit Tokenize überprüfen und trotzdem werde ich GAE verwenden, so dass es nicht viel von Belang ist.Bearbeiten: IMO das ist nicht das Duplikat vonQ: 661084 denn wo es aufhört fängt man an, möchte ich auch mit wissen__builtins__
gesperrt, kann der Benutzer schlechte Dinge tun?