php - 未捕获的 PDOException 泄露用户名和密码

标签 php pdo

try {
    self::$dbinstance = new PDO(
        "mysql:host=$c[host];dbname=$c[dbname]", $c['user'], $c['password']
    );

    self::$dbinstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
catch(PDOException $e) {
    echo "Errors" . $e->getMessage();
}

在上面的代码中,如果 PDO 无法连接到主机,则会发生 fatal error ,从而泄露用户名和密码。

Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2003]
Can't connect to MySQL server on '172.25.102.65' (10060)' in
D:\xampp\htdocs\mytest\wh_client_2.1\classes\importmodule-class.php:33 Stack trace: #0
D:\xampp\htdocs\mytest\wh_client_2.1\classes\importmodule-class.php(33): PDO-
>__construct('mysql:host=172....', 'host', 'password') #1

一种可能的方法是在 php.ini 中关闭 display_error=0 ,但这样我就无法知道我的主机何时没有响应.

有办法修改错误消息吗?

最佳答案

错误处理和错误报告之间存在差异。

  • 错误处理是防止最终用户看到任何堆栈跟踪、重要信息或自动生成的错误消息的过程。它还可以通过使用 try catch block 来修改脚本的运行方式。
  • 错误报告定义给定脚本将报告哪些信息。

为了正确处理错误,我认为 ini_set('display_errors',0); 是更好的方法。您不希望屏幕上显示任何错误消息。

但是,我希望获得有关错误的所有可能信息,因此我使用 error_reporting(E_ALL);

错误被写入文件 error_log 中,该文件通常与您的 index.php(或直接调用的任何 PHP 文件)位于同一级别。您还可以从 cPanel 访问它。

<小时/>

您的错误可能未被捕获,因为您的代码位于命名空间中,而您想要捕获全局命名空间PDOException。使用 \ 指示您正在查找全局 PDOException 的脚本。一旦发现错误,您可以使用PDOException class的正常方法回显您想要的内容。 .

try {
    $db = new PDO (/*connection infos*/);
}
catch (\PDOException $e) {
    switch ($e->errorCode()) {
        case 'HY000':
        // Or whatever error you are looking for
        // here it's the general error code
            mail('your@email.com','connection problem',$e->getTraceAsString());
            $db = new PDO (/*rollback connection infos of a local database*/);
            break;
    }
}

这会向您发送一封邮件,其中包含错误的痕迹,防止您的用户在告诉您出现问题时看到它。

这里是the reference PDO 语句返回的错误代码。

关于php - 未捕获的 PDOException 泄露用户名和密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59417136/

相关文章:

php - laravel Eloquent 嵌套评论和回复

php - 代码不会在 else 语句中显示错误信息

php - 批量插入包含俄语的字符串

php - 插入 - php mysql

php - 插入数据 PDO 时出现问题

php - PDO 插入引发无法解释的 "Array to string conversion"错误

php - PHP PDO 语句可以接受表名或列名作为参数吗?

php - 数组 ||非法偏移类型

PHP MySql - 每个页面加载的最大查询数

php - 我网站上显示的随机 "<"打开角括号