我想在Laravel 5.1中抛出错误时设置要显示给用户的自定义消息。例如,在控制器中我可能有:
if(!has_access()){
abort('401', 'please contact support to gain access to this item.');
}
然后我的自定义错误页面我将显示错误:
$exception->getMessage();
但是,如果出现SQL错误或其他事件怎么办?那还会设置我在错误页面上不知不觉地输出的异常消息吗?
PHP docs for getMessage()没有详细说明这一点。
如何在不引入任何安全风险的情况下设置特定的异常消息?
答案 0 :(得分:2)
如果您访问app.php
文件:
'debug' => env('APP_DEBUG', false),
在生产环境中,将其设置为false。这将确保在生产环境中不显示任何调试错误。
设置完成后,您可以通过控制器响应正常异常。其他任何事情,laravel都不会显示错误页面。
答案 1 :(得分:2)
但是,如果出现SQL错误或其他事件怎么办?那还会设置我在错误页面上不知不觉地输出的异常消息吗?
可能,是的。 PHP不保证异常消息的内容将是"安全"向用户显示,并且很可能某些类会抛出包含敏感信息的异常。
如果要使用异常向用户显示错误,请对这些异常使用Exception
的特定子类,并且仅在异常是该子类的实例时打印消息,例如
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 :(得分:0)
是,
如果您以类似方式使用代码,则$ e-> getMessage()可能会揭示有关代码的更多信息:
try {
$executeSomethingHereForWhichYouExpectAnException();
// Basic \Exception that reports everything
} catch (\Exception $e) {
$error = $e->getMessage();
}
即使'debug' => false
中有app.php
。例如,如果您的代码有错误,则$ error将显示它-基本上任何类型的错误(PHP,MYSQL,ETC);
但是,有一个修复程序-可以捕获您的CustomException消息并防止在出现这种情况时显示典型错误:
try {
$executeSomethingHereForWhichYouExpectAnException();
// Our custom exception that throws only the messages we want
} catch (\CustomException $e) {
// Would contain only 'my_custom_message_here'
$error = $e->getMessage();
}
您可能要问的区别是什么-区别在于,我们使用\ CustomException类代替了基本的错误报告,该异常是从$executeSomethingHereForWhichYouExpectAnException()
函数中抛出的:
executeSomethingHereForWhichYouExpectAnException(){
if (something) {
throw new CustomException("my_custom_message_here", 1);
}
}
如果您有更多的例外情况,则可以这样包含它们(自PHP7.1起):
try {
something();
} catch(\CustomException | \SecondCustomException $e) {
// custom exceptions
} catch(\Exception $e) {
// basic exception containing everything
}