Ошибка, слишком много подключений к MySQL с использованием PDO показали наши имя пользователя и пароль БД? - PullRequest
3 голосов
/ 28 октября 2011

В какой-то момент раньше оказалось, что было слишком много SQL-соединений, и было отсканировано следующее для того, кто бы ни искал:

PHP Fatal error:  Uncaught exception 'PDOException' with message  'SQLSTATE[08004] [1040] Too many connections' in /dir/file.php:21
Stack trace:
#0 /dir/file.php(21): PDO->__construct('mysql:host=loca...', 'the user', 'password')

Как видите, на нем напечатаны имя пользователя и пароль.

Я новичок в PDO-форме подключения к БД, и я вошел в нее, потому что мне сказали, что моя обычная форма mysql_connect небезопасна. Однако по умолчанию, когда mysql_connect когда-либо тоже имел какие-либо соединения, он никогда не выводил имя пользователя и пароль на экран.

Какая катастрофа.

Как я могу остановить PDO от этого, если произошла ошибка ??

Я использую:

$dbh = new PDO('mysql:host=localhost;dbname=' . $db, $user, $pass);

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

PDO не делает ничего подобного.

Это происходит потому, что вы не выполняете никакой обработки исключений, поэтому вызывается обработчик ошибок PHP по умолчанию, который отображает ваш стек вызовов, включая аргументы функции.

Обычно стеки вызовов - это очень хорошая вещь, поэтому вы хотите обработчик ошибок для работы; вам просто нужно правильно его использовать.

  • Размещайте try / catch блоки в соответствующих местах кода, которые могут генерировать исключения; по крайней мере, поместите универсальный блок try / catch вокруг верхнего уровня вашего кода, чтобы ничего не просачивалось.

Документация PDO, тем не менее, четко указывает (в красной рамке предупреждения) на большой риск, который вы берете на себя, неправильно отслеживая исключения PDO:

Если ваше приложение не отлавливает исключение, сгенерированное конструктором PDO, действие по умолчанию, выполняемое механизмом zend, заключается в завершении сценария и отображении обратной трассировки. Эта обратная трассировка, скорее всего, покажет полную информацию о подключении к базе данных, включая имя пользователя и пароль. Вы обязаны перехватить это исключение либо явно (с помощью оператора catch), либо неявно с помощью set_exception_handler ().

(http://www.php.net/manual/en/pdo.connections.php)

2 голосов
/ 28 октября 2011

Отредактируйте свой php.ini и установите

display_errors = 0

Если у вас нет доступа к php.ini, то в начале вашего скрипта (ов) вам нужно добавить:

ini_set("display_errors", "0");

См. http://php.net/manual/en/errorfunc.configuration.php и http://php.net/manual/en/function.error-reporting.php

Это остановит вывод всех ошибок в браузер. Убедитесь, что вы все еще регистрируете ошибки (через настройку php.ini).

P.S. Не выбрасывайте PDO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...