Помилка, занадто багато підключень до mysql за допомогою PDO показали наше db ім'я користувача та пароль?

На певному етапі раніше з'ясовувалося, що забагато з'єднань 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 підключення до db, і я потрапив до нього, тому що люди сказали мені, моя регулярна форма mysql_connect була небезпечна. Однак за замовчуванням, коли mysql_connect колись мав занадто будь-які з'єднання, ніколи не друкував ім'я користувача та пароль на екрані.

Яка катастрофа.

Як зупинити PDO робити це, якщо це помилка?

Я використовую:

$dbh = new PDO('mysql:host=localhost;dbname=' . $db, $user, $pass);
3
Я погоджуюся, що це проблема, і її треба підняти до команди PDO. Проголосуйте за приховування верифікацій за помилкою: bugs.php.net/bug.php ? id = 62184
додано Автор IMB, джерело
Добре, зроблю. Незважаючи на те, що здається химерним, варто навіть проголосувати - це просто смішне ім'я користувача та пароль для друку по замовчуванню в повідомленні про помилку! І особливо коли, мабуть, принаймні моє розуміння PDO - це зробити більш надійний спосіб доступу до бази даних! Супер провал
додано Автор willdanceforfun, джерело
Ви коли-небудь трапилися, щоб це зрозуміти?
додано Автор hafichuk, джерело

2 Відповіді

PDO не робить нічого подібного.

Це відбувається тому, що ви не виконуєте обробку виключень, тому запускається типовий обробник помилок PHP і відображається ваш стіл дзвінків, включаючи аргументи функції.

Зазвичай виклики стеків - це дуже добре, так що ви хочете працювати з обробником помилок; вам просто потрібно правильно його використовувати.

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

Проте документація PDO чітко зазначає (у червоному вікні попередження) великий ризик, який ви не приймаєте належним чином, вилучаючи винятки з PDO:

Якщо ваша програма не знімає виняток, викинутий з конструктора PDO, дія за замовчуванням, виконувана движком zend, полягає в тому, щоб припинити скрипт і відобразити зворотний слід. Цей зворотний слід, ймовірно, відкриє детальні відомості про повне з'єднання з базою даних, включаючи ім'я користувача та пароль. Ваша відповідальність полягає в тому, щоб зловити це виключення явно (через виписку про зловживання) або неявно через set_exception_handler ().

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

3
додано
Це має сенс для розумної версії самого себе. Тепер, якби я міг працювати, чим є спроба/зловмисник? дякую за покажчик !!
додано Автор willdanceforfun, джерело
Це також має сенс :)
додано Автор willdanceforfun, джерело
@cosmicbdog: Ви обов'язково повинні дізнатись про винятки, перш ніж використовувати бібліотеку, яка їх використовує!
додано Автор Lightness Races in Orbit, джерело

Відредагуйте свій php.ini та встановіть

display_errors = 0

Якщо у вас немає доступу до php.ini, то у верхній частині вашого сценарію потрібно додати:

ini_set("display_errors", "0");

See http://php.net/manual/en/errorfunc.configuration.php and http://php.net/manual/en/function.error-reporting.php

Це призведе до припинення виведення помилок у браузер. Переконайтеся, що ви все ще вносите помилки (через налаштування php.ini).

П.С. Не викидайте PDO

2
додано
цінуй це! Дякую.
додано Автор willdanceforfun, джерело
btw це display_errors = 0 або display_errors = вимкнено?
додано Автор willdanceforfun, джерело
Ні. Спіймати винятки.
додано Автор Lightness Races in Orbit, джерело
Якщо ви вимкнете помилки, ви не побачите, що відбувається ... (приховати їх для виробництва, хоча)
додано Автор Lightness Races in Orbit, джерело
@ TomalakGeret'kal Я повністю згоден, але ви все одно хочете вимкнути вивід в браузері, як запобіжний захід.
додано Автор hafichuk, джерело
або буде працювати - дотримуйтесь конвенції у файлі php.ini
додано Автор hafichuk, джерело