Modification de son propre mot de passe

lolo76
Invité n'ayant pas de compte PHPfrance

16 juin 2011, 14:29

Bonjour à tous !


Voilà, je voudrais que les gens qui se connectent au site puissent changer leur propre mot de passe et j'y suis presque !
Mon souci est que si je veux que ma requête soit prise en compte, je dois entrer mon ID en dur dans mon sql comme ceci:
$sql="UPDATE `users` SET `password`='".$password."' WHERE `id`=[color=#FF0000]19[/color] LIMIT 1" ;
$resultat=@mysql_db_query($dbname,$sql,$id_link);
Je vois envois tout le code qui en dépend....
INDEX.PHP (connexion)

Code : Tout sélectionner

if (isset($_POST['nom'])) { if ($_POST['nom']!="Deconnexion") { $sql="select * from users where nom like '".$_POST['nom']."' and password like '".$_POST['password']."' LIMIT 1"; $resultat=@mysql_db_query($dbname,$sql,$id_link); if (@mysql_num_rows($resultat)==0) { $motdepasse="KO"; } else { $rang=mysql_fetch_array($resultat); $motdepasse="OK"; $iduser=$rang['id']; $nomuser=$rang['prenomuser']; $habged=$rang['habged']; $habfds=$rang['habfds']; $habmail=$rang['habmail']; $habuser=$rang['habuser']; $habadm=$rang['habadm']; session_register("iduser"); session_register("motdepasse"); session_register("nomuser"); session_register("habged"); session_register("habfds"); session_register("habmail"); session_register("habuser"); session_register("habadm"); } } else { $motdepasse=""; $habfds=""; $habged=""; $habmail=""; $habuser=""; $habadm=""; $iduser=""; $nomuser=""; session_register("motdepasse"); session_register("habged"); session_register("habfds"); session_register("habmail"); session_register("habadm"); session_register("iduser"); session_register("habuser"); session_register("nomuser"); } } ?>
CHANGEPWD.PHP

Code : Tout sélectionner

<script language="javascript" type="text/javascript"> function validation() { if(document.changepwd.password1.value == "") { alert ('Le mot de passe est vide !'); document.changepwd.password1.focus(); return false; } if(document.changepwd.password1.value != document.changepwd.password2.value) { alert ('Les mots de passe ne correspondent pas !'); document.changepwd.password1.value = ""; document.changepwd.password2.value = ""; document.changepwd.password1.focus(); return false; } else {return true;} } </script> <form name="changepwd" action="index.php?prog=changepwd2.php" method="post" onsubmit="return validation();"> <table> <tr> <td valign="top">Entrer votre nouveau mot de passe :</td> <td><input type="password" name="password1" size="40" maxlength="40"></td> </tr> <tr> <td valign="top">confirmer votre nouveau mot de passe :</td> <td><input type="password" name="password2" size="40" maxlength="40"></td> </tr> </table><BR><input type="submit" value="Modifier"></form>

CHANGEPWD2

Code : Tout sélectionner

<?php session_start(); $iduser=$_POST['iduser']; $password=$_POST['password1']; $sql="UPDATE `users` SET `password`='".$password."' WHERE `id`=????? LIMIT 1" ; $resultat=@mysql_db_query($dbname,$sql,$id_link); ?> <center>Mot de passe modifié</center>

ViPHP
ViPHP | 2577 Messages

16 juin 2011, 14:40

Bonjour,

Je t'invite à essayer de te connecter en mettant ' OR '1' = '1 comme mot de passe (solution : http://php.net/manual/fr/function.mysql ... string.php)

Pour ton problème, pourquoi tu n'utilise pas $_SESSION['iduser'] ?

Invité
Invité n'ayant pas de compte PHPfrance

16 juin 2011, 14:56

J'y avais pensé en plus pour le $_SESSION je l'ai pas fait car j'étais à bout de nerf ><
merci beaucoup :D .


Ceci dit, pourquoi et où utiliser 'OR '1'=' 1 ?

ViPHP
ViPHP | 2577 Messages

16 juin 2011, 15:01

A la place de saisir ton mot de passe lorsque tu te connectes. Sauf erreur de ma part ca doit marcher comme mot de passe. Tu peux mettre n'importe quel nom d'utilisateur avec ce mot de passe.

Invité
Invité n'ayant pas de compte PHPfrance

16 juin 2011, 15:09

Ah ouais en effet, ca me connecte en tant qu'admin.

C'est pas un peu problèmatique ? si quelqu'un le sait et qu'il se connecte alors qu'il n'en a pas les droits ?

ViPHP
ViPHP | 2577 Messages

16 juin 2011, 15:14

C'est une faille connue par beaucoup. Avec la démonstration, je pense que tu vas te méfier maintenant.

La fonction mysql_real_escape_string() permet de résoudre ce problème. Il faut l'utiliser pour toute les données issue d'une saisie, pas seulement pour la connexion.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 juin 2011, 15:15

clairement ta requet SQL va être

select * from users where nom like 'truc' and password like '' or '1'='1' LIMIT 1

ce qui sera toujours vrai car le or à la fin ben il est toujours vrai (si sis la chaine 1 c'est égale à la chaine 1, ça aussi avec bob ou marcel ;) ).

Après quel est le problème ?

on met le nom de n'importe qui est on se connecte avec son compte sans aucune soucis ;) (et pour faire vraiment ce que l'on veux on regarde aqui appartient et zou ton site ne t'appartient plus ;) ).

la fonction indiqué par mazarini (mysql_real_escape_string) permet "d'échapper" les caractères spéciaux de mysql et donc d'éviter ce type de soucis.
la requete deviendrait
select * from users where nom like 'truc' and password like '\' or \'1\'=\'1' LIMIT 1
et donc myqsl va chercher un mot de passe identique à ' or '1'='1, qu'il ne devrait pas trouver ;)

autre chose, pourquoi utilise like ? il est utile en cas de recherche "partielle" pas dans ce cas l'équalité et la chose à utiliser
select * from users where nom='truc' and password = 'mdp' LIMIT 1
deplus j'ajouterais que la limite n'est pas utile, si tu a plus d'une réopnse c'est que tu a merdé la vérification à l'inscription ;) (ça ne doit pas arriver si c'est le merdier).

dernière chose, petite remarque sur la fonction session_register
Avertissement

Cette fonction est OBSOLETE depuis PHP 5.3.0. Nous vous encourageons vivement à ne plus l'utiliser.
je t'invite donc a lire ce tuto relatant de la chose :)

edit : bordel je suis trop long a taper :/

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

16 juin 2011, 15:37

Long à taper, mais beaucoup plus clair.

Enfin, je pense que l'on aura convaincu un programmeur de l'utilité du mysql_real_escape_string(). C'est une journée productive.

Invité
Invité n'ayant pas de compte PHPfrance

16 juin 2011, 15:40

Certe, vous m'avez complètement convainqu !

Maintenant je cherche à ce que ca marche^^
Et finalement le $_SESSION n'a pas fonctionné, il fonctionnait que pour moi bizarement...

Invité
Invité n'ayant pas de compte PHPfrance

16 juin 2011, 15:55

Après de nombreux test, le mot de passe se change mais uniquement sur l'ID 19 meme si je me connecte avec un autre utilisateur.

Pourtant ma requete est la suivante:

Code : Tout sélectionner

session_start(); $iduser=$_SESSION['iduser']; $password=$_POST['password1']; $sql="UPDATE `users` SET `password`='".$password."' WHERE `id`='".$iduser."' LIMIT 1" ;

ViPHP
ViPHP | 2577 Messages

16 juin 2011, 15:57

Et si tu fais afficher l'id juste après la connexion et juste avant la modification du mot de passe ?


Dans ton premier post, je voie :
<?php
session_start();
$iduser=$_POST['iduser'];
$password=$_POST['password1'];


$sql="UPDATE `users` SET `password`='".$password."' WHERE `id`=????? LIMIT 1" ;
$resultat=@mysql_db_query($dbname,$sql,$id_link);
?>
<center>Mot de passe modifié</center>
ne faut il pas mettre $iduser=$_SESSION['iduser'];
ou ajouter un input hidden dans le formulaire de changement de mot de passe ?

Invité
Invité n'ayant pas de compte PHPfrance

16 juin 2011, 16:08

Juste après la connexion il me met ID=32 jusque là tout va bien...

Juste avant de changer de mot de passe, rien ne s'affiche,
et une fois changé ID=19

Invité
Invité n'ayant pas de compte PHPfrance

16 juin 2011, 16:10

Oui je l'ai remplacé depuis, maintenant j'ai bien $iduser=$_SESSION['iduser'];

désolé pour le double post

ViPHP
ViPHP | 2577 Messages

16 juin 2011, 16:34

Il faut que tu cherches ou tu peux mettre 19 dans la variable et que tu contrôles les affectations de la variable.

Mets des "echo" dans ton script pour essayer de suivre, de mon coté, je n'ai rien vu.

Invité
Invité n'ayant pas de compte PHPfrance

16 juin 2011, 16:41

Je ne trouve rien pour le moment, je trouve ca vraiment bizare qu'il soit figé comme ca sur cet ID.

Le cache ou quelque chose de ce genre pourrait avoir un rapport avec tout ca ?