Erreur, trop de connexions à mysql en utilisant PDO ont montré notre nom d'utilisateur et mot de passe db

Un peu plus tôt, il semblait qu'il y avait trop de connexions SQL et les éléments suivants ont été renvoyés pour rechercher ceux qui cherchaient:

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')

Comme vous pouvez le voir, le nom d’utilisateur et le mot de passe sont imprimés.

Je suis nouveau dans la forme de PDO de connexion à la base de données, et je me suis lancé parce que les gens me disaient que mon formulaire mysql_connect habituel n'était pas sécurisé. Cependant, par défaut, lorsque mysql_connect avait déjà des connexions, il jamais imprimait le nom d'utilisateur et le mot de passe à l'écran.

Quel désastre.

Comment puis-je empêcher PDO de le faire si l'erreur est supprimée?

J'utilise:

$dbh = new PDO('mysql:host=localhost;dbname=' . $db, $user, $pass);
3
Je conviens que c'est un problème et que cela devrait être porté à l'attention de l'équipe PDO. Veuillez voter pour la dissimulation des informations d'identification en cas d'erreur: bugs.php.net/bug.php ? id = 62184
ajouté l'auteur IMB, source
OK, je vais le faire. Bien que cela semble bizarre, il devrait même y avoir un besoin de voter - c'est ridicule de donner par défaut les informations d'identification du nom d'utilisateur et du mot de passe dans un message d'erreur !! Et surtout quand apparemment, au moins ma compréhension de PDO est de créer un moyen plus sécurisé d’accès à une base de données! Super échec.
ajouté l'auteur willdanceforfun, source
Avez-vous déjà trouvé celui-ci?
ajouté l'auteur hafichuk, source

2 Réponses

Le PDO ne fait rien de la sorte.

Cela se produit parce que vous n'effectuez aucune gestion d'exception. Le gestionnaire d'erreur PHP par défaut est appelé et affiche votre pile d'appels, y compris les arguments de la fonction.

Généralement, les piles d’appel sont une très bonne chose. Vous voulez donc que le gestionnaire d’erreur fonctionne; vous avez juste besoin de l'utiliser correctement.

  • Placez essayez / des blocs catch aux endroits appropriés autour du code pouvant générer des exceptions; à tout le moins, placez un bloc try / catch fourre-tout autour du niveau supérieur de votre code afin que rien ne s'infiltre.

La documentation sur les AOP, cependant, indique clairement (dans une boîte d’avertissement rouge) le risque important que vous courez de ne pas détecter correctement les exceptions AOP:

Si votre application n'intercepte pas l'exception émise par le constructeur PDO, l'action par défaut du moteur zend consiste à terminer le script et à afficher une trace arrière. Cette trace arrière révélera probablement les détails complets de la connexion à la base de données, y compris le nom d'utilisateur et le mot de passe. Il est de votre responsabilité de détecter cette exception, soit explicitement (via une instruction catch), soit implicitement via set_exception_handler ().

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

3
ajouté
Cela a du sens pour une version plus intelligente de moi-même. Maintenant, si je pouvais travailler ce que l’essai/attrape est. merci pour le pointeur !!
ajouté l'auteur willdanceforfun, source
Cela a aussi du sens :)
ajouté l'auteur willdanceforfun, source
@cosmicbdog: Vous devez absolument en savoir plus sur les exceptions avant d'utiliser une bibliothèque qui les utilise!
ajouté l'auteur Lightness Races in Orbit, source

Editez votre php.ini et définissez

display_errors = 0

Si vous n'avez pas accès à php.ini, vous devez ajouter en haut de vos scripts:

ini_set("display_errors", "0");

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

Cela empêchera toutes les erreurs d'être envoyées au navigateur. Assurez-vous de toujours enregistrer les erreurs (via le paramètre php.ini).

P.S. Ne pas jeter AOP

2
ajouté
apprécie ça! Merci.
ajouté l'auteur willdanceforfun, source
btw est-ce display_errors = 0 ou display_errors = Off?
ajouté l'auteur willdanceforfun, source
Catch exceptions.
ajouté l'auteur Lightness Races in Orbit, source
Si vous désactivez les erreurs, vous ne verrez pas ce qui se passe ... (cachez-les pour la production, cependant)
ajouté l'auteur Lightness Races in Orbit, source
@ TomalakGeret'kal Je suis tout à fait d'accord, mais vous souhaitez toujours désactiver la sortie vers le navigateur par précaution.
ajouté l'auteur hafichuk, source
soit cela fonctionnera - suivez la convention dans votre fichier php.ini
ajouté l'auteur hafichuk, source