Persönlich denke ich, dass Code immer noch ziemlich böse ist, weil Sie nicht kommentieren, was er tut. Es testet auch nicht seine Eingaben auf Gültigkeit, was es sehr zerbrechlich macht.
Ich bin auch der Meinung, dass 95% (oder mehr) der Eval-Anwendungen aktiv gefährlich sind und die geringe potenzielle Zeitersparnis, die sie in anderen Fällen bieten könnte, es nicht wert ist, sich der schlechten Praxis der Verwendung zu widmen. Außerdem müssen Sie Ihren Schergen später erklären, warum Ihre Verwendung von eval gut und ihre schlecht ist.
Und natürlich sieht dein PHP wie Perl aus;)
Es gibt zwei Hauptprobleme bei eval () (als "Injektionsangriff" -Szenario):
1) Es kann Schaden anrichten. 2) Es kann einfach abstürzen
und eine, die mehr sozial als technisch ist:
3) Es wird Leute dazu verleiten, es unangemessen als Abkürzung an anderer Stelle zu verwenden
Im ersten Fall laufen Sie Gefahr (natürlich nicht, wenn Sie eine bekannte Zeichenfolge bewerten), dass beliebiger Code ausgeführt wird. Ihre Eingaben sind jedoch möglicherweise nicht so bekannt oder fest wie Sie denken.
Wahrscheinlicher (in diesem Fall) stürzt Sie einfach ab und Ihre Zeichenfolge wird mit einer unbegründet undurchsichtigen Fehlermeldung beendet. Meiner Meinung nach sollte der gesamte Code so ordentlich wie möglich fehlschlagen. Andernfalls sollte eine Ausnahme ausgelöst werden (als die am besten behandelbare Form des Fehlers).
Ich würde vorschlagen, dass Sie in diesem Beispiel eher durch Zufall als durch Verhalten codieren. Ja, die SQL-Enum-Anweisung (und sind Sie sicher, dass das Feld enum ist? - Haben Sie das richtige Feld der richtigen Tabelle der richtigen Version der Datenbank aufgerufen? Hat sie tatsächlich geantwortet?) Sieht in PHP wie eine Array-Deklarationssyntax aus. Ich würde jedoch vorschlagen, dass Sie nicht den kürzesten Weg von der Eingabe zur Ausgabe finden, sondern die angegebene Aufgabe angehen:
- Stellen Sie fest, dass Sie eine Aufzählung haben
- Extrahieren Sie die innere Liste
- Entpacken Sie die Listenwerte
Das ist ungefähr die Option, die Sie wählen, aber ich würde einige Wenn und Kommentare aus Gründen der Klarheit und Sicherheit umschließen (z. B. wenn die erste Übereinstimmung nicht übereinstimmt, eine Ausnahme auslösen oder ein Nullergebnis setzen).
Es gibt immer noch einige mögliche Probleme mit Kommas oder Anführungszeichen, und Sie sollten die Daten wahrscheinlich entpacken und dann in Anführungszeichen setzen, aber Daten werden zumindest als Daten und nicht als Code behandelt.
Mit der preg_version ist Ihr schlechtestes Ergebnis wahrscheinlich $ result = null, mit der eval-Version ist das schlechteste unbekannt, aber zumindest ein Absturz.
$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);