显示PHP异常消息是否存在安全风险?

时间:2016-03-16 20:31:11

标签: php security laravel exception-handling laravel-5.1

我想在Laravel 5.1中抛出错误时设置要显示给用户的自定义消息。例如,在控制器中我可能有:

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

然后我的自定义错误页面我将显示错误:

$exception->getMessage();

但是,如果出现SQL错误或其他事件怎么办?那还会设置我在错误页面上不知不觉地输出的异常消息吗?

PHP docs for getMessage()没有详细说明这一点。

如何在不引入任何安全风险的情况下设置特定的异常消息?

3 个答案:

答案 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
}