Problème de récupération d'une donnée
Fermé
Braxx
-
6 févr. 2014 à 12:00
le_joker_fou Messages postés 764 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 7 août 2014 - 7 févr. 2014 à 13:54
le_joker_fou Messages postés 764 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 7 août 2014 - 7 févr. 2014 à 13:54
A voir également:
- Problème de récupération d'une donnée
- Récupérer une vidéo youtube - Guide
- Convertisseur récupération de texte - Guide
- Logiciel de recuperation de donnée - Guide
- Impossible de récupérer mon compte gmail - Guide
- Récupération message whatsapp - Guide
4 réponses
le_joker_fou
Messages postés
764
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
7 août 2014
239
6 févr. 2014 à 12:25
6 févr. 2014 à 12:25
Salut,
Premièrement, es-tu sur que les commentaires s'enregistrent bien en base?
Car après lecture de ton code, la requête suivante :
devrait te renvoyer une erreur en te spécifiant que "$membre_commentaire" est un array et non un string, ajoute un mysql_error();
Deuxièmement, mes cheveux se sont dressés en voyant ça :
Visiblement tu as un gros problème de sécurité, mot de passe en claire dans la base. Et surtout, tu sélectionnes tous les membres pour ensuite parcourir tes résultats si tu as 10 membres ça passe, mais imagine le jour ou tu auras 2000 membres le temps que cela va prendre pour la connexion.
Premièrement, es-tu sur que les commentaires s'enregistrent bien en base?
Car après lecture de ton code, la requête suivante :
mysql_query("insert into commentaires(id_article,membre_commentaire,corps_commentaire, date_commentaire) values('$id','$membre_commentaire','$corps_commentaire',NOW())");
devrait te renvoyer une erreur en te spécifiant que "$membre_commentaire" est un array et non un string, ajoute un mysql_error();
Deuxièmement, mes cheveux se sont dressés en voyant ça :
<?php $login = $_POST["login"]; $mdp = $_POST["mdp"]; try{ $req = "select * from membres"; $qid = $bdd->query($req); $qid->execute(); while ($row = $qid->fetch()) { if($login == $row['membre_pseudo']) { if($mdp == $row['membre_mdp']) { session_start(); $_SESSION['login'] = $login; $_SESSION['pwd'] = $mdp; header('location: index1.php'); } } } $qid->closeCursor(); } catch (PDOException $error) { die ("Erreur de connexion : ". $error->getMessage()); } ?>
Visiblement tu as un gros problème de sécurité, mot de passe en claire dans la base. Et surtout, tu sélectionnes tous les membres pour ensuite parcourir tes résultats si tu as 10 membres ça passe, mais imagine le jour ou tu auras 2000 membres le temps que cela va prendre pour la connexion.
Salut le_joker_fou, Oui les commentaires s'enregistre bien dans la base j'ai vérifier. merci de ta réponse, pourrais-tu me proposer une solution dans le programme. Car je débute dans tout ça j'ai plusieurs difficultés
le_joker_fou
Messages postés
764
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
7 août 2014
239
Modifié par le_joker_fou le 6/02/2014 à 15:40
Modifié par le_joker_fou le 6/02/2014 à 15:40
Salut,
Prmière chose, place des or die(mysql_error()) après toutes tes requêtes. Cela te permettra de voir si tu as une requête qui plante.
Ensuite pour la connexion des membre, je serais plus prudent de hasher les mots de passe. Exemple en sha1() :
L'avantage du hash c'est qu'il n'est pas réversible. Si ta base se fait pirater, le pirate aura plus de mal pour trouver les mot de passe en claire. Enfin après il existe des technique pour mais ce n'est pas le sujet ici.
Pour la connexion tu recherches d'abord le membre et ainsi tu compares les hash des mots de passe entre-eux
Une fois que tu auras bien maitrisé les bases PHP, je t'invite à faire des recherches sur la sécurité web, il existe de nombreux sites qui en parlent
Attention : cela est un exemple basique, qui est encore grandement "sécurisable".
Prmière chose, place des or die(mysql_error()) après toutes tes requêtes. Cela te permettra de voir si tu as une requête qui plante.
Ensuite pour la connexion des membre, je serais plus prudent de hasher les mots de passe. Exemple en sha1() :
echo sha1('mot_de_passe');
L'avantage du hash c'est qu'il n'est pas réversible. Si ta base se fait pirater, le pirate aura plus de mal pour trouver les mot de passe en claire. Enfin après il existe des technique pour mais ce n'est pas le sujet ici.
Pour la connexion tu recherches d'abord le membre et ainsi tu compares les hash des mots de passe entre-eux
//On recherche le membre par son login $membre_query = mysql_query("SELECT * FROM membres WHERE login='$login';")or die(mysql_error()); $membre = mysql_fetch_assoc($membre_query); //Si on a un membre if(!empty($membre) && (mysql_num_rows($membre_query) == 1)) { //On compare les hashs des mots de passe if($membre['password'] == sha1($password)) { echo "connecté"; } else { echo "échec"; } } else { echo "fail"; }
Une fois que tu auras bien maitrisé les bases PHP, je t'invite à faire des recherches sur la sécurité web, il existe de nombreux sites qui en parlent
Attention : cela est un exemple basique, qui est encore grandement "sécurisable".
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
6 févr. 2014 à 16:39
6 févr. 2014 à 16:39
Quelques remarques :
Pas besoin de placer des "or die()" partout si tu utilises les exceptions PDO (aussi, il ne pas que PDO soit en mode silencieux pour voir les messages d'erreurs). Evite également d'utiliser les fonctions mysql_* qui sont obsolète depuis un bon moment.
https://www.php.net/manual/fr/pdo.error-handling.php
Ton exemple est moins sécurisé que celui proposé par Braxx car en utilisant directement tes variables post sans échapper les caractères spéciaux, ton code offre une belle faille d'injection sql.
En utilisant PDO, il faut utiliser les requêtes préparées ou la méthode PDO::quote() pour échapper les caractères spéciaux dans les requêtes sql.
https://www.php.net/manual/fr/pdo.prepare.php
http://www.php.net/manual/fr/pdo.quote.php
Concernant le hashage des mots de passe, sha1 ou md5 ne sont pas conseillé. Préfère l'utilisation de la nouvelle api de hashage de php 5.5, ou la fonction crypt().
https://www.php.net/manual/fr/faq.passwords.php
Pour finir, tant qu'à vérifier l'existence du login dans la requête, pourquoi ne pas vérifier également la correspondance du mot de passe dans la requête sql ?
Pas besoin de placer des "or die()" partout si tu utilises les exceptions PDO (aussi, il ne pas que PDO soit en mode silencieux pour voir les messages d'erreurs). Evite également d'utiliser les fonctions mysql_* qui sont obsolète depuis un bon moment.
https://www.php.net/manual/fr/pdo.error-handling.php
Ton exemple est moins sécurisé que celui proposé par Braxx car en utilisant directement tes variables post sans échapper les caractères spéciaux, ton code offre une belle faille d'injection sql.
En utilisant PDO, il faut utiliser les requêtes préparées ou la méthode PDO::quote() pour échapper les caractères spéciaux dans les requêtes sql.
https://www.php.net/manual/fr/pdo.prepare.php
http://www.php.net/manual/fr/pdo.quote.php
Concernant le hashage des mots de passe, sha1 ou md5 ne sont pas conseillé. Préfère l'utilisation de la nouvelle api de hashage de php 5.5, ou la fonction crypt().
https://www.php.net/manual/fr/faq.passwords.php
Pour finir, tant qu'à vérifier l'existence du login dans la requête, pourquoi ne pas vérifier également la correspondance du mot de passe dans la requête sql ?
le_joker_fou
Messages postés
764
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
7 août 2014
239
7 févr. 2014 à 13:54
7 févr. 2014 à 13:54
Ton exemple est moins sécurisé que celui proposé par Braxx
Concernant le hashage des mots de passe, sha1 ou md5 ne sont pas conseillé.
D'où ma dernière ligne : Attention : cela est un exemple basique, qui est encore grandement "sécurisable".
J'évite de le faire dans un but d'amélioration de la sécurité. Si tu te prends une injection SQL et que celle-ci passe, elle va forcément te retourner un résultat et donc identifier le membre. Dans mon code, si je me prends une injection SQL qui me renvoi un résultat (la plupart du temps le premier enregistrement de la base) il faut obligatoirement que le mot de passe saisi correspondent à celui de mon premier enregistrement en base.
Pour finir, tant qu'à vérifier l'existence du login dans la requête, pourquoi ne pas vérifier également la correspondance du mot de passe dans la requête sql ?
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
6 févr. 2014 à 17:04
6 févr. 2014 à 17:04
Salut,
Ton problème n'est pas définie : tu ne dis pas ce qui ne marche pas et ce que tu attends. Peux tu également préciser si tu as un message d'erreur ?
Attention au mélange des APIs :
Dans connexion.php, il semble que tu utilises PDO tandis que dans le reste de ton code tu utilises l'api MySQL (fonctions mysql_*).
Je te conseil d'utiliser toujours la même api pour éviter plusieurs problèmes. Puisque l'api MySQL est obsolète, préfère MySQLi ou PDO.
Toujours dans connexion.php, supprime les lignes vides entre tes balises php, celles-ci peuvent empêcher la session php de s'initialiser correctement (tu peux aussi placer l'instruction session_start() dès le début de ton fichier php).
https://www.php.net/session_start
Bonne journée
Ton problème n'est pas définie : tu ne dis pas ce qui ne marche pas et ce que tu attends. Peux tu également préciser si tu as un message d'erreur ?
Attention au mélange des APIs :
Dans connexion.php, il semble que tu utilises PDO tandis que dans le reste de ton code tu utilises l'api MySQL (fonctions mysql_*).
Je te conseil d'utiliser toujours la même api pour éviter plusieurs problèmes. Puisque l'api MySQL est obsolète, préfère MySQLi ou PDO.
Toujours dans connexion.php, supprime les lignes vides entre tes balises php, celles-ci peuvent empêcher la session php de s'initialiser correctement (tu peux aussi placer l'instruction session_start() dès le début de ton fichier php).
https://www.php.net/session_start
Bonne journée