2016-03-16 11 views
5

Desidero impostare un messaggio personalizzato da visualizzare all'utente quando lancio un errore in Laravel 5.1. Per esempio, in un controller potrei avere:Mostrare il messaggio di eccezione PHP potrebbe essere un rischio per la sicurezza?

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

Poi la mia pagina di errore personalizzata avrei visualizzare l'errore con:

$exception->getMessage(); 

Tuttavia, quello che se ci fosse un errore di SQL o un altro evento? Non avrebbe impostato anche il messaggio di eccezione che avrei inconsapevolmente trasmesso sulla mia pagina di errore?

Il PHP docs for getMessage() non entrare in molti dettagli su questo.

Come è possibile impostare un messaggio di eccezione specifico senza introdurre rischi per la sicurezza?

+0

Non so circa laravel ma tutti i quadri che ho usato includono una 'HttpException' classe (che è derivato da' Exception') e il blocco catch intercetta solo le eccezioni di quella classe 'cattura (HttpException $ e) '. Quindi, suppongo che sia vero anche per Laravel perché è diventato una pratica generale per i framework avere questo – Gasim

+1

Potenzialmente sì, perché potrebbe visualizzare informazioni di sicurezza come i dettagli di accesso dell'utente a seconda dell'eccezione .... ma tu non dovrebbe comunque visualizzare la traccia dello stack in un ambiente di produzione, disabilitare l'impostazione di debug delle app –

+0

È vero. Ho appena risposto in base alla chiamata di funzione specifica di OP '$ exception-> getMessage()' – Gasim

risposta

2

Tuttavia, cosa succede se si è verificato un errore SQL o un altro evento? Non avrebbe impostato anche il messaggio di eccezione che avrei inconsapevolmente trasmesso sulla mia pagina di errore?

Potenzialmente, sì. PHP non garantisce che il contenuto dei messaggi di eccezione sia "sicuro" da mostrare agli utenti, ed è abbastanza probabile che alcune classi generino eccezioni che includono informazioni sensibili nel messaggio.

Se si desidera utilizzare eccezioni per visualizzare gli errori per gli utenti, utilizzare una sottoclasse specifica di Exception per tali eccezioni e stampare il messaggio solo se l'eccezione era un'istanza di tale sottoclasse, ad es.

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

Se si accede app.php del file:

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

Nella tua env di produzione, impostare questo su false. Ciò assicurerebbe che nessun errore di debug verrebbe visualizzato nell'ambiente di produzione.

Una volta impostato, è possibile rispondere alle normali eccezioni tramite il controller. Qualsiasi altra cosa, laravel non mostrerebbe la pagina di errore.

+0

Forse sto facendo qualcosa di sbagliato, ma quando ho impostato 'APP_DEBUG' su false e poi cambio il mio DB di configurazione per usare una password SQL errata,' $ exception-> getMessage() 'restituisce:' I dettagli sono: SQLSTATE [HY000] [1045] Accesso negato per l'utente 'homestead' @ 'localhost' (usando password: YES) 'che è esattamente il tipo di errore che non vuoi che gli utenti vedano. – Justin

+0

Se si attiva il debug e si tenta di accedere a qualsiasi pagina che richiede una connessione con il database, e se la password non è corretta, visualizzerà l'eccezione all'utente finale. Ma in questo caso, dal momento che hai disattivato la modalità di debug, il messaggio predefinito sarebbe "Qualcosa è andato storto". Laravel nasconderebbe il precedente messaggio di errore relativo al database.Ciò impedirebbe la visualizzazione delle informazioni del database all'utente. Nel tuo esempio, stai tentando esplicitamente di accedere all'eccezione e di visualizzarla. –

+0

Giusto. Sto ignorando la pagina di errore "qualcosa è andato storto" e sto usando le mie pagine di errore personalizzate (che includono il messaggio di errore). La mia speranza era che potessi sopprimere i messaggi di sistema e visualizzare solo quelli che ho impostato manualmente. – Justin