Bonsoir bonsoir !
Je suis actuellement en train de développer un forum en php. Pour cela, j'ai créé une base de données sur alwaysdata, ainsi que des pages forum, login, subscribe.
Cependant, je suis loin d'avoir de l'expérience (c'est la première fois que je fais ça, et je n'ai pas vraiment de cours, je me "débrouille") et je rencontre quelques petits problèmes.
Le premier problème :
Lorsque l'on s'inscrit sur mon forum via le formulaire suivant prévu à cet effet, il n'y a aucun problème. La personne reçoit un e-mail avec ses identifiants, je reçois un e-mail me disant qu'une personne s'est inscrite et le nouvel utilisateur apparaît dans ma base de données... bref, tout roule ! Mais (parce qu'il y a un mais) je me suis rendue compte que je ne gérais pas le cryptage de mot de passe, il apparaît en clair dans ma BDD comme n'importe quel autre champ (gros problème de sécurité/confidentialité), j'ai donc cherché comment y remédier et j'ai trouvé... md5 !
J'ai compris le principe, un mot sera toujours crypté de la même façon avec md5 donc on cherche à crypter le mot de passe lorsqu'on l'enregistre puis lorsque la personne essaie de se connecter, on récupère le mdp tapé et on le crypte de la même façon avant de le comparer avec celui enregistré... Théoriquement, je ne voyais aucun problème. Mais en pratique, c'est plus compliqué et ça ne marche pas ! J'imagine que je n'ai pas mis les md5 aux bons endroits, ou que j'en ai oublié mais je tourne en rond et ne trouve pas OÙ !
Alors voilà mon code AVANT le cryptage (celui qui marche, donc) :
• subscribe.php
Au niveau des erreurs elles servent à gérer :
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 <?php include 'base.php'; var_dump($_SESSION); if(''!=$_POST['Name'] && ''!=$_POST['Firstname'] && ''!=$_POST['Nickname'] && ''!=$_POST['email'] && ''!=$_POST['password'] && ''!=$_POST['Verif'] && ''!=$_POST['Reponse']) { if ($_POST['action']=='Inscription' && $_POST['password']==$_POST['Verif']) { $query = 'INSERT INTO user (Name, Firstname, Nickname, email, password, Reponse) VALUES (\'' . $_POST['Name'] . '\', \'' . $_POST['Firstname'] . '\', \'' .$_POST['Nickname'] . '\', \'' . $_POST['email'] . '\', \'' . $_POST['password'] . '\',\'' . $_POST['Reponse'] . '\')'; $dbResult = mysqli_query($dbLink,$query); if(!$dbResult) { echo 'erreur de requête<br/>'; // Affiche le type d'erreur. echo 'erreur : ' . mysqli_error($dbLink) . '<br/>'; // Affiche la requête envoyée. echo 'requête : ' . $query . '<br/>'; //exit(); header('location:./forum.php?err=5'); } else{ $Message='Voici vos identifiants d\'inscription : ' . "\n"; $Message .= 'email :' . $_POST['email'] . "\n"; $Message .= 'Mot de passe :' . $_POST['password'] . "\n"; $subject='Bienvenue'; $headers = 'From: Name <' . $from . '>' ."\n"; $headers .= 'Return-Path: <' . $reply . '>' . "\n"; $message2 = 'Un nouvel utilisateur s\'est inscrit.'; $to2= 'monadresseemail@gmail.com'; $subject2 = '[PHP]-Nouvel inscrit sur votre site'; $headers2 = 'From: Name <' . $from . '>' ."\n"; mail($_POST['email'], $subject, $Message, $headers); mail($to2, $subject2, $message2, $headers2); $_SESSION['email']=$_POST['email']; $_SESSION['password']=$_POST['password']; $_SESSION['user_id']='ok'; header('location:./forum.php?err=6'); } } elseif ($_POST['password']!=$_POST['Verif']) { header('location:./forum.php?err=2'); } } else { header('location:./forum.php?err=3'); } ?>
5> Requête impossible.
6> Un email avec vos identifiants vient de vous être envoyé. (ce n'est donc pas une erreur, c'est un succès)
2> Mots de passe différents.
3> Toutes les données ne sont pas renseignées. (on ne s'en sert pas puisqu'on vérifie que les champs soient non nuls avant de commencer, mais bon..)
• login.php
Pour les erreurs :
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 <?php include 'base.php'; $Name=$_POST['Name']; $Firstname=$_POST['Firstname']; $Nickname=$_POST['Nickname']; $email=$_POST['email']; $password=$_POST['password']; $Verif=$_POST['Verif']; $action=$_POST['action']; if($action=='Connexion') { if(!(empty($email) || empty($password))) { $query='SELECT * FROM user WHERE email=\''.$email .'\' AND password=\''.$password .'\''; $query_exe = mysqli_query($dbLink, $query); $dbResult = mysqli_fetch_assoc($query_exe); if(isset($dbResult['email'],$dbResult['password'])) { session_start(); $_SESSION['email'] = $email; $_SESSION['password']=md5($password); $_SESSION['user_id']='ok'; header('Location:./listpost.php'); } else{ $_SESSION['user_id']='nok'; header('Location:./forum.php?err=7'); } } else{ $_SESSION['user_id']='nok'; header('Location:./forum.php?err=4'); } } ?>
4> Vous devez vous connecter
7> Mot de passe ou adresse e-mail incorrect
Comme vous l'aurez sans doute compris, dans le fichier 'base.php', il y a mysqli_connect et mysqli_select_db qui me permettent l'accès à ma BDD sur alwaysdata.
Maintenant, voilà comme je modifie mon code pour gérer le cryptage (ce qui ne marche pas, donc) :
• subscribe.php
C'est donc ici la ligne 13 qui a été modifiée.
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 <?php include 'base.php'; var_dump($_SESSION); if(''!=$_POST['Name'] && ''!=$_POST['Firstname'] && ''!=$_POST['Nickname'] && ''!=$_POST['email'] && ''!=$_POST['password'] && ''!=$_POST['Verif'] && ''!=$_POST['Reponse']) { if ($_POST['action']=='Inscription' && $_POST['password']==$_POST['Verif']) { $query = 'INSERT INTO user (Name, Firstname, Nickname, email, password, Reponse) VALUES (\'' . $_POST['Name'] . '\', \'' . $_POST['Firstname'] . '\', \'' .$_POST['Nickname'] . '\', \'' . $_POST['email'] . '\', \'' . md5($_POST['password']) . '\',\'' . $_POST['Reponse'] . '\')'; $dbResult = mysqli_query($dbLink,$query); if(!$dbResult) { echo 'erreur de requête<br/>'; // Affiche le type d'erreur. echo 'erreur : ' . mysqli_error($dbLink) . '<br/>'; // Affiche la requête envoyée. echo 'requête : ' . $query . '<br/>'; //exit(); header('location:./forum.php?err=5'); } else{ $Message='Voici vos identifiants d\'inscription : ' . "\n"; $Message .= 'email :' . $_POST['email'] . "\n"; $Message .= 'Mot de passe :' . $_POST['password'] . "\n"; $subject='Bienvenue'; $headers = 'From: Name <' . $from . '>' ."\n"; $headers .= 'Return-Path: <' . $reply . '>' . "\n"; $message2 = 'Un nouvel utilisateur s\'est inscrit.'; $to2= 'monadresseemail@gmail.com'; $subject2 = '[PHP]-Nouvel inscrit sur votre site'; $headers2 = 'From: Name <' . $from . '>' ."\n"; mail($_POST['email'], $subject, $Message, $headers); mail($to2, $subject2, $message2, $headers2); $_SESSION['email']=$_POST['email']; $_SESSION['password']=$_POST['password']; $_SESSION['user_id']='ok'; header('location:./forum.php?err=6'); } } elseif ($_POST['password']!=$_POST['Verif']) { header('location:./forum.php?err=2'); } } else { header('location:./forum.php?err=3'); } ?>
• login.php
Ici, c'est donc la ligne 16 (j'ai également essayé en modifiant directement la ligne 8 en mettant
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 <?php include 'base.php'; $Name=$_POST['Name']; $Firstname=$_POST['Firstname']; $Nickname=$_POST['Nickname']; $email=$_POST['email']; $password=$_POST['password']; $Verif=$_POST['Verif']; $action=$_POST['action']; if($action=='Connexion') { if(!(empty($email) || empty($password))) { $query='SELECT * FROM user WHERE email=\''.$email .'\' AND password=\''.md5($password) .'\''; $query_exe = mysqli_query($dbLink, $query); $dbResult = mysqli_fetch_assoc($query_exe); if(isset($dbResult['email'],$dbResult['password'])) { session_start(); $_SESSION['email'] = $email; $_SESSION['password']=md5($password); $_SESSION['user_id']='ok'; header('Location:./listpost.php'); } else{ $_SESSION['user_id']='nok'; header('Location:./forum.php?err=7'); } } else{ $_SESSION['user_id']='nok'; header('Location:./forum.php?err=4'); } } ?>mais ça n'a pas mieux marché).
Code : Sélectionner tout - Visualiser dans une fenêtre à part $password=md5($_POST['password']);
Après avoir modifié ça, quand j'essaie de me connecter après avoir créé un compte, j'obtiens toujours l'erreur 7 à savoir que le mot de passe (ou l'email, mais pas le cas ici) est incorrect. La comparaison entre les mdp cryptés n'est donc pas fructueuse..
__________________
Le second problème :
J'aimerais qu'une personne essayant de s'inscrire avec une adresse e-mail déjà existante dans la BDD ne le puisse pas... J'ai donc essayé de gérer cela en modifiant mon code comme cela :
• subscribe.php
Les modifications sont au début du code (lignes 7-14) mais au final, on rentre toujours dans la boucle même si l'adresse e-mail existe déjà... J'en déduis que la requête n'est pas comprise mais je ne comprends pas si c'est un problème de syntaxe (à priori pas d'erreur dans le code), de place.. Pour moi, la boucle semble logique et comme je suis vraiment débutante dans ce domaine, je ne vois vraiment pas où ça coince...
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 <?php include 'base.php'; var_dump($_SESSION); if(''!=$_POST['Name'] && ''!=$_POST['Firstname'] && ''!=$_POST['Nickname'] && ''!=$_POST['email'] && ''!=$_POST['password'] && ''!=$_POST['Verif'] && ''!=$_POST['Reponse']) { $requete = 'SELECT * FROM user WHERE email=\'' .$_POST['email'] . '\''; $resultat=mysqli_query($requete,$dbLink); if(mysqli_num_rows($resulat)==0){ if ($_POST['action']=='Inscription' && $_POST['password']==$_POST['Verif']) { $query = 'INSERT INTO user (Name, Firstname, Nickname, email, password, Reponse) VALUES (\'' . $_POST['Name'] . '\', \'' . $_POST['Firstname'] . '\', \'' .$_POST['Nickname'] . '\', \'' . $_POST['email'] . '\', \'' . $_POST['password'] . '\',\'' . $_POST['Reponse'] . '\')'; $dbResult = mysqli_query($dbLink,$query); if(!$dbResult) { echo 'erreur de requête<br/>'; // Affiche le type d'erreur. echo 'erreur : ' . mysqli_error($dbLink) . '<br/>'; // Affiche la requête envoyée. echo 'requête : ' . $query . '<br/>'; //exit(); header('location:./forum.php?err=5'); } else{ $Message='Voici vos identifiants d\'inscription : ' . "\n"; $Message .= 'email :' . $_POST['email'] . "\n"; $Message .= 'Mot de passe :' . $_POST['password'] . "\n"; $subject='Bienvenue'; $headers = 'From: Name <' . $from . '>' ."\n"; $headers .= 'Return-Path: <' . $reply . '>' . "\n"; $message2 = 'Un nouvel utilisateur s\'est inscrit.'; $to2= 'monadresseemail@gmail.com'; $subject2 = '[PHP]-Nouvel inscrit sur votre site'; $headers2 = 'From: Name <' . $from . '>' ."\n"; mail($_POST['email'], $subject, $Message, $headers); mail($to2, $subject2, $message2, $headers2); $_SESSION['email']=$_POST['email']; $_SESSION['password']=$_POST['password']; $_SESSION['user_id']='ok'; header('location:./forum.php?err=6'); } } elseif ($_POST['password']!=$_POST['Verif']) { header('location:./forum.php?err=2'); } } else{ header('location:./forum.php?err=8'); } } else { header('location:./forum.php?err=3'); } ?>
Voilà, j'espère vraiment que certains d'entre vous pourront m'aider à règler ces deux petits problèmes qui m'empêchent de continuer à avancer dans la réalisation de mon forum.
Merci beaucoup à tout ceux qui prendront la peine de lire (j'admets que c'est un peu long) et surtout de répondre !
Bonne soirée !
Partager