PDO: ist Try-Catch notwendig oder nicht?

8

Ich bekomme gemischte Signale. Die Warnung in der PDO-Dokumentation scheint ziemlich klar zu sein, dass das Auslassen des Try-Catch die Sicherheit beeinträchtigen könnte. Jedoch dieser Thread deutet darauf hin, dass es nicht wirklich notwendig ist. Meiner Meinung nach wäre es ziemlich ärgerlich, jede Abfrage in einen try-catch zu legen. Irgendwelche Ratschläge, wie man damit umgeht?

    
David Jones 30.06.2012, 05:26
quelle

3 Antworten

10

Es besteht ein Sicherheitsrisiko, aber Sie müssen nicht überall versuchen / fangen. Wenn Sie keine Ausnahme abfangen, besteht die Gefahr, dass die Fehlermeldung der Ausnahme (die vertrauliche Informationen enthalten könnte) den Benutzern angezeigt wird.

Aber wie in der Dokumentation angegeben, können Sie stattdessen einen Ausnahme-Handler hinzufügen . Durch die Weiterleitung zu einer allgemeinen Fehlermeldung können Sie verhindern, dass Ihren Benutzern vertrauliche Informationen aus Fehlermeldungen angezeigt werden.

Das Setzen eines generischen Fehler-Handlers scheint in jedem Fall sehr sinnvoll zu sein. Sie möchten Ihren Benutzern keine kryptischen Fehlermeldungen anzeigen. Selbst wenn Sie mit dem Ansatz "try / catch everything" arbeiten, ist es schwierig, 100% ig sicher zu sein, dass Sie alle möglichen Ausnahmebedingungen erfasst haben. Daher sollte der Exception-Handler weiterhin als Fallback verwendet werden.

    
Mark Byers 30.06.2012, 05:33
quelle
3

PDO hat drei konfigurierbare Fehlermodi . Standardmäßig wird nur ein Fehlercode festgelegt und keine Ausnahme ausgelöst.

Sie sollten jedoch PDO::ERRMODE_EXCEPTION verwenden. Die Art und Weise, wie PHP und PDO normalerweise mit Fehlern umgehen (d. H. Leise mit dem Code weitermachen und das Falsche tun, ohne dir zu sagen ) ist absolut verrückt und ein großer Grund für die Grausamkeit von PHP.

Wenn bei Ihrer Anfrage etwas schief geht, müssen Sie die Ausführung stoppen und eine Ausnahme auslösen, damit Sie eine eindeutige Rückverfolgung haben und das Problem finden und beheben können.

Außerdem ist es viel einfacher (d. h. weniger "ärgerlich"), try-catch zu verwenden, als nach jeder einzelnen Abfrage errorCode und errorInfo zu überprüfen. Sie sollten try-catch nur verwenden, wenn Sie die Möglichkeit des Fehlers erwarten und etwas dagegen tun können - andernfalls sollten Sie die Ausnahme einfach auflösen. Wenn es ein unerwarteter Fehler ist, liegt das wahrscheinlich an einem Fehler in Ihrem Code und Sie sollten darüber über die Ausnahme Bescheid wissen, damit Sie es beheben können!

Wenn Sie etwas Besonderes mit dem Melden der Ausnahme machen möchten (zB pretty-print es, senden Sie eine E-Mail, was auch immer), dann registrieren Sie ein Standard Exception Handler , um alle nicht abgefangenen Ausnahmen zu behandeln. Auf einem Produktionssystem sollten Sie einen Standardausnahmebehandler registrieren, der eine generische 500-Seite anzeigt und Fehlerdetails anzeigt, und den gesamten Traceback an anderer Stelle für das Debugging protokollieren.

    
Francis Avila 30.06.2012 05:42
quelle
1

Wenn ein Fehler auftreten kann , wird es schließlich . Sie müssen mit jedem möglichen Fehler umgehen, den Ihre PDO-Abfragen unabhängig von der Umgebung, in der Sie ausgeführt werden, generieren können. Machen Sie die Annahme (wie die Jungs in dem Thread, den Sie gepostet haben), dass, da dies ein Produktionssystem ist, versuchen..Catch ist nicht notwendig ist dumm, IMHO. Fehler werden nicht nur beim Debuggen von Code ausgelöst, sondern können auch auf einem Produktivsystem auftreten. Persönlich mag ich Kontext um die Fehler, die ich in meinen Protokollen sehe, also verwende ich try..catch um meine Abfragen.

Dies hat auch nichts mit den Fehlern zu tun, die Sie Ihren Benutzern präsentieren. Ich finde, dass die Verwendung des Wortes Sicherheit die Dinge in diesem Kontext vage macht. Ihr System sollte niemals kryptische Fehlermeldungen (die potenziell sensible Daten enthalten könnten) für Benutzer anzeigen, unabhängig davon, wie Sie mit Fehlern umgehen (dies ist nicht PDO-spezifisch).

Dafür gibt es mehrere Möglichkeiten:

  1. Erstellen Sie eine Funktion für Ihre PDO-Abfragen, indem Sie eine vorbereitete Anweisung übergeben, an die bereits alles gebunden ist.
  2. Erstellen Sie einen globalen Exception-Handler und fangen Sie alle Exceptions ab (Ich mag diesen Ansatz nicht, da Sie den Kontext verlieren ... Welchen Fehler zeige ich dem Benutzer, wenn dieser in einem globalen Handler gefangen wurde? von solch einem Fehler, wenn es in einem globalen Kontext gefangen wurde?).
  3. Initialisiere PDO , um keine Ausnahmen auszulösen und manuelle Fehlerprüfungen durchzuführen, wenn das dein Gift ist. Persönlich finde ich, dass Exceptions besser mit einem OOP-basierten System zusammenpassen, aber für jedes sein eigenes.

Mein 2c.

    
Lior Cohen 30.06.2012 05:44
quelle

Tags und Links