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

The*_*can 53 php mysql security connection pdo

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

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

我的网站上有一些流量,达到服务器连接限制,网站抛出此错误,其中包含我的PLAIN密码!

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

具有讽刺意味的是,出于安全考虑我转向PDO,所以这让我感到震惊,因为这个确切的错误是你可以在大多数使用简单的http泛滥的网站上轻易引起的.

我现在已将我的连接包装在try/catch块中,但我认为这仍然是灾难性的!

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

Bra*_*rad 21

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

是的,您还应该在try/catch块中使用它.

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

  • 好吧,我理解,但我仍然认为默认应该是安全的一面...... (14认同)
  • @Joe,那么你应该把它与PDO开发人员联系起来.我发现它没有像这样从堆栈中返回信息的问题.一旦你意识到这一点,这不是问题.当然,在某些应用程序中,try/catch会被遗忘......对于某些人而言,这不可避免地会成为一个问题......你是对的. (2认同)
  • 这两个建议似乎都不适合我.当连接失败时,错误堆栈将打印到屏幕上,并显示纯文本密码.我正在使用PHP ActiveRecord. (2认同)

Mat*_*ias 15

简单的解决方法是捕获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());
}
Run Code Online (Sandbox Code Playgroud)

  • 基本概念很糟糕.没有人应该在对象中放置一个普通密码并将其保存在内存中.正确的解决方案是更改PDO代码,而不是将普通密码放入异常消息中.我认为这是PDO本身的一个漏洞和一个安全漏洞. (8认同)
  • ......这会让开发人员没有错误信息,否则会帮助他们解决问题. (2认同)
  • 获得异常“无法连接到数据库”会让开发人员没有任何信息吗?我不这么认为 (2认同)

Rob*_*itt 7

好吧,这让我有点傻笑,错误报告的使用是出于调试目的,它允许您快速查找和修复问题.

当您处于实时环境中时,您的服务器应该仅配置为内部日志记录,而不是直接输出,因此基本上您需要关闭您的服务器中的错误输出php.ini.

display_errors = Off
Run Code Online (Sandbox Code Playgroud)

但是当你在测试环境中时,这个堆栈只是一个可以帮助你的工具,并且是可配置的.

当在实时环境中发生错误时,它们将被记录,因此您应始终检查日志文件,然后进行相应的修复.

人们可能会指定您可以管理PHP应用程序中的错误,但是根据个人喜好,我认为这是错误的方法,为您的Web服务器和MySQL/MsSQL配置INI和配置文件将导致更严格的管理.

如果您的应用程序是公共应用程序,那么处理应用程序中的错误也是一个好主意,因为大部分客户端可能在共享主机上,并且没有对服务器配置的完全访问权限.