58 votes

Pourquoi PDO imprime-t-il mon mot de passe lorsque la connexion échoue?

J'ai un simple site où je établir une connexion à un serveur Mysql en utilisant PDO.

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

J'ai eu un peu de trafic sur mon site et les serveurs de connexion limite a été atteint, et le site web de se débarrasser de cette erreur, avec mon mot de passe en clair dans ce!

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08004] [1040] Trop d' connexions " dans /home/domaine/html/index.php:xxx Stack trace: #0 /home/domain/html/index.php(64): PDO->__construct('mysql:host=loca...', 'UTILISATEUR', 'SECRET', Array) #1 {principal} jeté dans /home/domain/html/index.php sur ligne 64

Ironie du sort, je suis passé à PDO pour des raisons de sécurité, cela m'a choqué.

Parce que cette erreur exacte est quelque chose que vous pouvez provoquer très facilement sur la plupart des sites à l'aide de simple http inondations.

J'ai maintenant enveloppé mes conenction dans un try/catch de la clause, mais tout de même. Je pense que c'est catastrophique!

Donc, je suis nouveau sur les AOP et mon questino est: Que dois-je envisager pour en être sûr! Comment puis-je établir une connexion de façon sécurisée? Il y a des failles de sécurité connues comme celui-ci que je dois être au courant?

22voto

Brad Points 61171

Vous devriez avoir display_errors = off dans votre PHP.ini de toute façon à éviter ce problème. Les erreurs qui révèlent des détails comme ceux-ci viennent dans de nombreux endroits, en plus de l'AOP.

Oui, vous devez également le faire dans un bloc try/catch.

Vous pouvez également $pdo->setAttribute(PDO::ERRMODE_SILENT), mais alors vous devez vérifier les codes d'erreur manuellement plutôt que d'utiliser un bloc try/catch. Voir http://php.net/manual/en/pdo.setattribute.php pour plus d'constantes d'erreur.

16voto

Matthias Points 39

Solution de contournement simple pour attraper PDOException levée par le constructeur PDO:

 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('Could not connect to database');
}
 

8voto

RobertPitt Points 28140

Ok ça m'a fait rire un peu, l'utilisation de rapports d'erreurs sont à des fins de débogage, il vous permet de trouver rapidement et de résoudre les problèmes.

Lorsque vous êtes dans un environnement réel de votre serveur doit être configuré pour la consignation interne uniquement, et pas de sortie directe, donc, fondamentalement, vous devrez désactiver la sortie des erreurs dans votre php.ini.

display_errors = Off

Mais pendant que vous êtes au sein de votre environnement de test cette pile est simplement un outil pour vous aider, et est configurable.

Lorsque des erreurs se produisent dans un environnement réel, ils seraient enregistrés, de sorte que vous devriez toujours vérifier vos fichiers de log et ensuite corrigé en conséquence.

Les gens peuvent spécifier que vous pouvez gérer les erreurs dans votre Application PHP, mais par préférence personnelle, je pense que c'est la mauvaise façon de s'y prendre, la configuration de l'INI et les fichiers de configuration de votre serveur web et MySQL / MsSQL entraînera de plus en plus aigu de la gestion.

Si votre demande est publique demande alors ce serait également une bonne idée pour gérer les erreurs dans l'application comme un grand pourcentage de clients peuvent être sur l'hébergement mutualisé et de ne pas avoir un accès complet à des configurations de serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X