Exception 当出现错误时,如何防止PHP脚本显示凭据或其他重要数据?

Exception 当出现错误时,如何防止PHP脚本显示凭据或其他重要数据?,exception,pdo,Exception,Pdo,我试图以一种方式处理异常或错误,使它们不会脱口而出有关我的应用程序的任何重要细节。我想知道防止这种事情发生的最佳方法。从下面的代码片段中,您认为这会防止凭据被转储到屏幕上吗 public static function exception_handler($exception) { die('Uncaught exception: '.$exception->getMessage()); } public function __construct() { $this-

我试图以一种方式处理异常或错误,使它们不会脱口而出有关我的应用程序的任何重要细节。我想知道防止这种事情发生的最佳方法。从下面的代码片段中,您认为这会防止凭据被转储到屏幕上吗

public static function exception_handler($exception) 
{
    die('Uncaught exception: '.$exception->getMessage());
}

public function __construct() 
{
    $this->host     = 'xxxxx';
    $this->dbname   = 'xxxxx';
    $this->dsn      = "host";
    $this->username = 'xxxx';
    $this->password = 'xxxx';
    $this->opt      = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];

    set_exception_handler(array(__CLASS__, 'exception_handler'));
    parent::__construct($this->dsn, $this->username, $this->password, $this->opt);
    restore_exception_handler();
}

是的,它会,但它几乎没有帮助,因为错误消息本身也会泄漏。

此外,仅为单行设置错误处理程序没有意义。你的应用程序中有很多类,有很多凭据和敏感信息。因此,您可以看出,您更希望防止任何泄漏,而不是您意外发现的唯一泄漏

所以,不要管你的数据库类

public function __construct() 
{
    $this->host     = 'xxxxx';
    $this->dbname   = 'xxxxx';
    $this->dsn      = "host";
    $this->username = 'xxxx';
    $this->password = 'xxxx';
    $this->opt      = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    parent::__construct($this->dsn, $this->username, $this->password, $this->opt);
}
(尽管如此,最好还是别管PDO本身,因为您的类很可能感染了其中一些)

而站点范围的处理程序应该是这样的

set_exception_handler('exception_handler'));
public static function exception_handler($exception) 
{
    error_log("[$errno] $errstr in $errfile:$errline");
    header('HTTP/1.1 500 Internal Server Error', TRUE, 500);
    die('Server error');
}

捕获错误,将其记录到磁盘,然后向用户输出一般错误消息。当他们报告错误时,支持人员可以检查日志。