Bonjour,
Après une exeption, j'ai eu un message d'erreur qui affichait le serveur, le nom de ma base de donnée, le user, et le mot de passe (en rouge sur l'image ci-dessous).
Tout ça en clair.
C'est normal ?
En production PDO doit être en mode silencieux (mode par défaut).
Le serveur PHP globalement d'ailleurs ne doit pas afficher les erreurs en production.
N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP
C'est contestable pour le mot de passe c'est sûr mais un mode de debugage doit bien afficher des informations.
N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP
C'est d'autant plus normal que tu n'as pas géré l'exception de la connexion.
cf pdo constructPDO::__construct() émet une exception PDOException si la tentative de connexion à la base de données échoue.
Tu pourrais faire afficher ce que tu veux en cas d'erreur de connexion en gérant cette exception.
du genre comme cela ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 try { $connexion= new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo 'Connexion échouée'; }
Oui par exemple. A noter que depuis quelques années tu peux mettre le charset après le paramètre database. Aussi il est recommandé de désactiver l'émulateur pdo de php pour faire travailler celui du sgbb qui est plus optimisé. Typiquement cela donne :
Pour tes requêtes suivantes n'oublies pas de faire un $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); si elles ne sont pas dans des blocs try/catch qui permettent de gérer les exceptions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 try { $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; // Permet d'utiliser l'émulateur pdo spécifique au sgbdd. Indispensable pour éviter que la fonction execute() formate le tableau de valeurs (correspondant aux marqueurs) passé en paramètre dans cette fonction en "string", sinon bug avec la clause limit. $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false; /* autres options de configurations, par exemple pour récupérer les résultats en mode objet : $pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ; */ $connexion= new PDO($dsn.';charset=utf8', $user, $password, $pdo_options); } catch (PDOException $e) { echo 'Connexion échouée'; }
Si j’interprète correctement le message d’erreur, ce n’est pas PDO à proprement parler qui dévoile le mot de passe, mais PHP en affichant les détails de l’exception. Le vrai problème est que le mot de passe se trouve en dur dans le code justement à la ligne qui lève l’exception. Il est généralement recommandé de ne pas mettre ses mots de passe en dur dans le code, surtout quand celui-ci est versionné ; à la place, utilise les variables d’environnement quand c’est possible (en hébergement mutu, ce n’est souvent pas possible malheureusement), ou alors un fichier include inaccessible depuis le web.
La FAQ JavaScript – Les cours JavaScript
Touche F12 = la console → l’outil indispensable pour développer en JavaScript !
Le message d'erreur affiche le mot de passe même s'il vient d'une variable.
N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP
Merci ABCIWEB
J'ai fait comme tu me l'a proposé
Par contre, je n'ai pas compris (même en lisant la doc) à quoi sert :
J'ai une partie de mes requêtes dans des blocs try/catch et une autres sans ce bloc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
C'est grave docteur ?
Salut,
Si tu utilises le mode exception il faut que tes requêtes soient dans un bloc try/catch pour gérer l'exception sinon en cas d'erreur tu vas avoir un message "uncaught exception ...". Pour les requêtes sans bloc try/catch on utilise la plupart du temps le mode SILENT. Donc si au début tu utilises le mode exception et qu'ensuite tu fais des requêtes sans bloc try/catch il faut changer le mode d'erreur.
En résumé dans l'idéal ce serait mieux que toutes les erreurs soient gérées de la même façon et de préférence en utilisant le mode exception, mais on peut alterner les modes (ici EXCEPTION et SILENT) en adaptant la gestion des erreurs suivant les cas avec $connexion->setAttribute(mode d'erreur). Compris ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager