2016-03-16 14 views
5

Ich möchte eine benutzerdefinierte Nachricht für den Benutzer angezeigt werden, wenn ich einen Fehler in Laravel 5.1. Zum Beispiel in einem Controller könnte ich habe:Wäre das Anzeigen der PHP Exception Message ein Sicherheitsrisiko?

if(!has_access()){ 
    abort('401', 'please contact support to gain access to this item.'); 
} 

meine benutzerdefinierte Fehlerseite Dann würde ich den Fehler angezeigt werden mit:

$exception->getMessage(); 

Was aber, wenn es einen SQL-Fehler oder ein anderes Ereignis? Wäre das nicht auch die Exception Message, die ich unwissentlich auf meiner Fehlerseite ausgeben würde?

Die PHP docs for getMessage() gehen nicht ins Detail darüber.

Wie kann ich eine bestimmte Ausnahmebedingungsnachricht festlegen, ohne ein Sicherheitsrisiko einzugehen?

+0

Ich weiß nicht, über Laravel aber alle Frameworks, die ich verwendet habe, gehören 'HttpException' Klasse (die von' Exception' abgeleitet ist) und der catch-Block fängt nur Ausnahmen von dieser Klasse 'catch (HttpException $ e) '. Also, ich nehme an, es ist auch für Laravel wahr, weil es eine allgemeine Praxis für Frameworks geworden ist, dass – Gasim

+1

Potentiell ja, weil es Sicherheitsinformationen wie Benutzeranmeldedetails abhängig von der Ausnahme anzeigen kann .... aber Sie sollte den Stack-Trace in einer Produktionsumgebung sowieso nicht anzeigen, deaktivieren Sie Ihre App Debug-Einstellung –

+0

Das stimmt. Ich antwortete nur auf der Grundlage der spezifischen Funktionsaufruf von OP '$ Ausnahme-> getMessage()' – Gasim

Antwort

2

Was aber, wenn es einen SQL-Fehler oder ein anderes Ereignis gab? Wäre das nicht auch die Exception Message, die ich unwissentlich auf meiner Fehlerseite ausgeben würde?

Möglicherweise ja. PHP gibt keine Garantie dafür, dass der Inhalt von Ausnahmemeldungen für Benutzer "sicher" angezeigt wird, und es ist sehr wahrscheinlich, dass einige Klassen Ausnahmen auslösen, die vertrauliche Informationen in der Nachricht enthalten.

Wenn Sie Ausnahmen verwenden möchten, um Benutzern Fehler anzuzeigen, verwenden Sie eine spezielle Unterklasse von Exception für diese Ausnahmen, und drucken Sie die Nachricht nur, wenn die Ausnahme eine Instanz dieser Unterklasse war, beispielsweise .

class UserVisibleException extends Exception { 
    // You don't need any code in here, but you could add a custom constructor 
    // if you wanted to. 
} 

// Then, in your abort() function... 
throw new UserVisibleException($message); 

// Then, in your exception handler... 
if ($exc instanceof UserVisibleException) { 
    print $exc->getMessage(); 
} else { 
    print "An internal error occurred."; 
} 
2

Wenn Sie Ihre app.php Datei zugreifen:

'debug' => env('APP_DEBUG', false), 

In Ihrer Produktion env, setzen Sie diese auf false gesetzt. Dies würde sicherstellen, dass keine Debug-Fehler in der Produktionsumgebung angezeigt werden.

Sobald dies eingestellt ist, können Sie auf normale Ausnahmen über Ihren Controller reagieren. Alles andere, Laravel würde die Fehlerseite nicht anzeigen.

+0

Vielleicht mache ich etwas falsch, aber wenn ich 'APP_DEBUG' zu false und dann ändern meine DB-Konfiguration ein falsches SQL-Passwort zu verwenden, $ exception-> getMessage() 'returns:' Die Details sind: SQLSTATE [HY000] [1045] Zugriff verweigert für Benutzer 'homestead' @ 'localhost' (mit Passwort: YES) 'was genau die Art von Fehler ist, die ich nicht habe möchte Benutzer sehen. – Justin

+0

Wenn Sie das Debug aktivieren und versuchen, auf eine Seite zuzugreifen, die eine Verbindung mit der Datenbank benötigt, und wenn das Kennwort falsch ist, würde es die Ausnahme für den Endbenutzer anzeigen. Aber in diesem Fall, da Sie den Debug-Modus deaktiviert haben, lautet die Standardmeldung "Etwas ist schief gelaufen". Laravel würde die vorherige datenbankbezogene Fehlermeldung ausblenden.Dies würde verhindern, dass Ihre Datenbankinformationen für den Benutzer angezeigt werden. In Ihrem Beispiel versuchen Sie explizit, auf die Ausnahme zuzugreifen und sie anzuzeigen. –

+0

Rechts. Ich überschreibe die Fehlerseite "etwas ging schief" und verwende meine eigenen benutzerdefinierten Fehlerseiten (die die Fehlermeldung enthalten). Meine Hoffnung war, dass ich die Systemmeldungen unterdrücken und nur die anzeigen konnte, die ich manuell gesetzt habe. – Justin

Verwandte Themen