为什么PDO在连接失败时打印我的密码?

2022-08-30 09:46:44

我有一个简单的网站,我使用PDO建立与MySQL服务器的连接。

$dbh = new PDO('mysql:host=localhost;dbname=DB;port=3306',
               'USER',
               'SECRET', 
               array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

我的网站上有一些流量,达到了服务器的连接限制,网站抛出了这个错误,里面有我的普通密码!

致命错误:未捕获的异常“PDOException”,消息“SQLSTATE[08004] [1040] 太多连接”在/home/domain/html/index.php:xxx 堆栈跟踪:#0 /home/domain/html/index.php(64):PDO->__construct('mysql:host=loca...', 'USER', 'SECRET', Array) #1 {main} 在 /home/domain/html/index.php 第 64 行

具有讽刺意味的是,出于安全原因,我切换到PDO,所以这真的让我感到震惊,因为这个确切的错误是你可以在大多数使用简单HTTP泛洪的网站上非常容易引发的。

我现在已经将我的连接包装在一个尝试/捕获块中,但我仍然认为这是灾难性的!

我是PDO的新手,所以我的问题是:我必须做些什么才能考虑安全?如何以安全的方式建立连接?还有其他已知的安全漏洞需要我注意吗?


答案 1

无论如何,你应该在你的PHP.ini来避免这个问题。除了PDO之外,揭示此类细节的错误还来自许多地方。display_errors = off

是的,您还应该在尝试/捕获块中使用它。

您也可以,但随后您需要手动检查错误代码,而不是使用 try/catch 块。有关更多错误常量,请参阅 http://php.net/manual/en/pdo.setattribute.php$pdo->setAttribute(PDO::ERRMODE_SILENT)


答案 2

一个简单的解决方法是捕获 PDO 构造函数引发的 PDOException:

try {
    $dbh  =  new PDO('mysql:host=localhost;dbname=DB;port=3306', 'USER',
    'SECRET', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
} catch (PDOException $e) {
    throw new Exception($e->getMessage());
}

推荐