Über "Eval ist böse" und "zustimmende Erwachsene" in Python [geschlossen]

8

Ich sehe viele sagen "Eval ist böse / gefährlich / unsicher ", weil man Dinge tun kann wie:

%Vor%

Während in anderen Posts pythoner als " zustimmende Erwachsene " betrachtet werden, gilt dies nicht Ich muss keine Typüberprüfung machen, weil Python von style ist duck typing .

Was ist dann mit dem folgenden Code:

%Vor%

Wie vermeiden Sie solche Fälle? Wann stimmen Pythoner Erwachsene zu und wann nicht?

    
zhangxaochen 03.03.2014, 06:55
quelle

3 Antworten

18

eval ist schlecht, weil Benutzereingaben irgendwann dazu kommen. Sie sollten sich (nicht, sollten Sie nicht) Sorgen machen über Code, der vorgibt, nicht alle Dateien zu löschen, weil Code das sowieso tun kann - Tada:

%Vor%

Und rm -rf / hat auch eine gute Chance, nicht zu arbeiten. ;)

Grundsätzlich ist "einwilligender Erwachsener" "vertraue deinem Code". eval ist "trust all code". Abhängig davon, woher du diesen Code bekommst, kann eval in Ordnung sein, aber in 99% der Fälle ist es unnötig, und es kann auch schwierig sein, dies als sicher zu garantieren.

    
Ry︁ 03.03.2014, 07:00
quelle
5

Es wäre albern, wenn Python versucht, die Benutzer zu zwingen, sie davon abzuhalten, Befehle aus ihrem Programm auszuführen, die sie genauso einfach direkt in eine Shell-Befehlszeile eingeben könnten, ohne Python zu verwenden.

Duck typing is OK, weil es keinen Code von J. Random Internet-User enthält. Sie sind (vermutlich) in der Lage, die Objekte, die Sie definieren, in einer Weise aufzurufen, die mit ihrer beabsichtigten Verwendung übereinstimmt.

eval() und exec (auch eine Funktion in Python 3, aber eine Anweisung in Python 2) gelten als gefährlich , wenn sie auf unzureichend validierte Benutzereingaben angewendet werden , weil Sie ohne Validierung sich selbst offen legen dem Willen einer böswilligen Benutzerbasis.

Mit anderen Worten, Code wie

%Vor%

ist gefährlich, gerade weil der Benutzer sich dafür entscheidet,

einzugeben %Vor%

oder etwas anderes, das ein ähnliches Risiko für Sie bedeutet.

    
holdenweb 03.03.2014 07:11
quelle
3

Oben

  

Verwendet eval in Python eine schlechte Praxis?

answer gibt 4 Gründe, warum eval schlecht ist

  1. Es gibt fast immer einen besseren Weg, es zu tun
  2. Sehr gefährlich und unsicher
  3. Macht das Debuggen schwierig
  4. Langsam

eval ist besonders sicherheitskritisch, wenn ein Teil der Zeichenkette von Benutzereingaben abgerufen wird und nicht vertrauenswürdige Benutzereingaben bereinigt werden. / Das Bestreben, die Sicherheit zu sichern, ist in der Regel wertlos, aber wie andere bereits erwähnt haben Fehler seiner Klasse. De-Serialisierung nicht vertrauenswürdiger / Benutzereingaben sagen aus Pickle oder JSON / Yml / Xml einschließlich der Deserialisierung beliebiger Objekte hat ein ähnliches Sicherheitsproblem.

Die Argumente 1/3/4 weisen darauf hin, dass eval in der Regel eine suboptimale Lösung ist, und zwar neben den Sicherheitsproblemen, die normalerweise vermieden werden können (indem sie nicht mit einer vom Benutzer erzeugten Zeichenkette verwendet werden) ein Problem sein, wenn es ein Implementierungsdetail ist, das leicht übersehen werden kann.

Es wird normalerweise als besserer Code / besser angesehen, andere Python-Features zu verwenden, um das gleiche zu implementieren, wenn möglich.

Trotzdem kann es nützlich sein, namedtuple in der std-Bibliothek wird mit ~~ eval ~~ exec implementiert (was ähnlich ist).

jemand anders erwähnt einen Vergleich zu goto, der in mancher Hinsicht auch "zu mächtig" ist, aber sehr nützlich sein kann (aber nur in c).

Ich habe es benutzt, um nützliche Debug-Funktionen und Ruby-ähnliche String-Interpolation für meinen Code zu entwickeln.

    
Roman A. Taycher 03.03.2014 08:05
quelle

Tags und Links