2016-03-16 30 views
5

Chcę ustawić niestandardową wiadomość, która będzie wyświetlana użytkownikowi, gdy zgłoszę błąd w Laravel 5.1. Na przykład, w kontrolerze może mam:Czy wyświetlanie komunikatu wyjątku PHP stanowiłoby zagrożenie dla bezpieczeństwa?

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

Wtedy moja spersonalizowana strona błędu Chciałbym wyświetlić błąd z:

$exception->getMessage(); 

Jednak co zrobić, jeśli wystąpił błąd SQL lub innego zdarzenia? Czy nie ustawiłoby to również komunikatu wyjątku, którego nieświadomie wysyłałem na mojej stronie błędu?

The PHP docs for getMessage() nie wchodzić w szczegóły na ten temat.

Jak ustawić konkretny komunikat wyjątku bez ryzyka bezpieczeństwa?

+0

nie wiem o laravel ale wszystkie ramy, które użyłem zawierać 'HttpException' klasę (która pochodzi z' Exception') oraz blok catch łapie tylko wyjątki tej klasy 'catch (HttpException $ e) '. Zgaduję, że jest to prawdą również dla Laravel, ponieważ stała się ona ogólną praktyką dla frameworków, które mają taką możliwość. – Gasim

+1

Potencjalnie tak, ponieważ może wyświetlać informacje o zabezpieczeniach, takie jak dane logowania użytkownika w zależności od wyjątku .... ale ty nie powinien wyświetlać śledzenia stosu w środowisku produkcyjnym, zrezygnuj z ustawienia debugowania aplikacji. –

+0

To prawda. Właśnie odpowiedziałem na podstawie specyficznego wywołania funkcji OP '$ exception-> getMessage()' – Gasim

Odpowiedz

2

Co jednak, jeśli wystąpił błąd SQL lub inne zdarzenie? Czy nie ustawiłoby to również komunikatu wyjątku, którego nieświadomie wysyłałem na mojej stronie błędu?

Potencjalnie tak. PHP nie gwarantuje, że zawartość wiadomości wyjątków będzie "bezpieczna" do wyświetlania użytkownikom, i jest całkiem prawdopodobne, że niektóre klasy będą zgłaszać wyjątki zawierające poufne informacje w wiadomości.

Jeśli chcesz używać wyjątków do wyświetlania błędów użytkownikom, użyj określonej podklasy Exception dla tych wyjątków i wydrukuj komunikat tylko wtedy, gdy wyjątek był instancją tej podklasy, np. , np.

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

Jeśli dostęp do pliku app.php:

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

W swojej ENV produkcyjnej, ustawiony na false. Zapewni to, że w środowisku produkcyjnym nie będą wyświetlane żadne błędy debugowania.

Po ustawieniu można reagować na normalne wyjątki za pośrednictwem kontrolera. Cokolwiek innego, laravel nie wyświetli strony błędu.

+0

Być może robię coś złego, ale kiedy ustawiam 'APP_DEBUG' na false, a następnie zmieniam konfigurację DB, aby użyć niepoprawnego hasła SQL,' $ wyjątek-> getMessage() 'zwraca:' Szczegóły: SQLSTATE [HY000] [1045] Odmowa dostępu dla użytkownika 'homestead' @ 'localhost' (przy użyciu hasła: YES) 'który jest dokładnie typem błędu, którego nie mam chcą, aby użytkownicy to widzieli. – Justin

+0

Po włączeniu debugowania i próbie uzyskania dostępu do dowolnej strony wymagającej połączenia z bazą danych, a jeśli hasło jest niepoprawne, wyświetliłby wyjątek dla użytkownika końcowego. Ale w tym przypadku, ponieważ wyłączyłeś tryb debugowania, domyślna wiadomość to "Coś poszło nie tak". Laravel ukryje poprzedni komunikat o błędzie związany z bazą danych.Zapobiegłoby to wyświetlaniu informacji o użytkowniku danych dla użytkownika. W twoim przykładzie wyraźnie próbujesz uzyskać dostęp do wyjątku i wyświetlać go. –

+0

Dobrze. Nadpisuję stronę błędu "coś poszło nie tak" i używam własnych stron błędów (które zawierają komunikat o błędzie). Miałem nadzieję, że mogę wyłączyć komunikaty systemowe i wyświetlić tylko te ręcznie ustawione. – Justin