Problème sur la création d'une page de connextion

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je fais appelle à vous car je rencontre un problème dans mon code PHP et je n'arrive pas a trouver les informations qu'il me faut sur le web. J'ai réussi à crée une page "inscription" qui fonctionne très bien, les utilisateurs sont bien enregistré dans la base de donnée. Mais je n'arrive pas a faire une page de "connexion", Il faudrait que j'arrive à comparer les informations envoyées par l'utilisateur (ici, login et mdp) avec celles qui ce trouvent dans la base de données. (j'ai crée une base de données sur modèle suivant : nom: Tests -> table: membres -> colonnes: "id" "pseudo" "pass" "email" "date_inscription")

Mon codes :

Formulaire de connexion :

 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
<?php
session_start();
?>
<?php
echo '<article class=contenu>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>minichat</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="all.css" rel="stylesheet" type="texte/css" />
</head>
<body class=TP2_mini_chat>
<?php include("menu.php"); ?>





         <form action="connextion_return.php" method="post">
             <p>
             <label for="pseudo1">Pseudo</label> : <input type="text" name="pseudo1" id="pseudo1" /><br/>
             <label for="pass1">pass</label> : <input type="text" name="pass1" id="pass1" /><br/>
             <input type="submit" value="Envoyer" />
             </p>
         </form>

<?php include("Pied_de_page.php"); ?>
</body>
</html>
<?php
echo '</article>';
?>

Informations du formulaire reçu et traitées :

 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
<?php
session_start();
?>
<?php
echo '<article class=contenu>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>minichat</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="all.css" rel="stylesheet" type="texte/css" />
</head>
<body class=TP2_mini_chat>
<?php include("menu.php"); ?>
       
<?php
// Connexion à la base de données
try
{
$bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
// Récupération des identifiants
$reponse = $bdd->prepare('SELECT pseudo, pass, id FROM membres');
?>
<?php
// test des idantifiants
while ($donnees = $reponse->fetch())
{
if (htmlspecialchars($donnees['pseudo']) == htmlspecialchars($_POST['pseudo1']) )
{
  $pseudo_et_pass = true;
}

else
{
  $pseudo_et_pass = false;
}
}
$reponse->closeCursor();
?>
<?php
if ($pseudo_et_pass == true )
{   
     $_SESSION['id'] = $donnees['id'];
   $_SESSION['pseudo'] = $donnees['pseudo'];
     header('location: Connextionsucces.php?');
}
else
{
  echo 'Erreur';
  
}
?>
   
   
   
<?php include("Pied_de_page.php"); ?>
</body>
</html>
<?php
echo '</article>';
?>

[ED] : je possède la dernière version de php, 5.5.12

Édité par TheLumMys

+0 -0

Cette réponse a aidé l'auteur du sujet

Pourquoi n'utilises pas une clause WHERE pour chercher directement l'utilisateur à partir de son pseudo ?

Imagines que tu as un million d'utilisateurs, tu te rends compte que parcourir toute la table en PHP pour établir la correspondance est particulièrement inefficace par rapport à si tu laissais le SGBD le faire pour toi (en te renvoyant directement la ligne correspondante sinon rien, il a les index pour le faire efficacement) ? D'autant plus que ton test est potentiellement (outre les htmlspecialchars qui ne servent à rien, que tu réexécutes htmlspecialchars sur la donnée POST à chaque itération et qu'il manquerait un break quand la correspondance sur le pseudo avait été établie) faux si ta colonne pseudo ignore casse/accent (interclassement suffixé de _ci chez MySQL) puisqu'en PHP ta comparaison est binaire/stricte.

Ensuite, ta requête préparée, en l'état ne sert à rien puisqu'elle n'a aucun paramètre et quand on prépare une requête, elle ne fera quelque chose que quand tu l'exécuteras. Etape que tu as visiblement oublié.

Il n'y a pas de gestion d'erreurs PDO et à aucun moment le mot de passe n'est testé (que j'espère ne pas être en clair ou encore simplement haché - ie sans salage).

Édité par vibrice

+0 -0

Cette réponse a aidé l'auteur du sujet

Je ne commenterai pas tout ton code car je n'ai pas trop le temps, mais ton problème vient d'ici:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// test des idantifiants
while ($donnees = $reponse->fetch())
{
if (htmlspecialchars($donnees['pseudo']) == htmlspecialchars($_POST['pseudo1']) )
{
    $pseudo_et_pass = true;
}

else
{
    $pseudo_et_pass = false;
}
}

Tu fais une boucle pour parcourir la BDD, et si le pseudo correspond à un pseudo dans la base, tu mets true, mais au prochain tour de boucle ça reviendra à false. (Donc en théorie seul le dernier inscrit peux se connecter).

De plus tu ne vérifie nul part le mot de passe…

+0 -0
Auteur du sujet

Je ne commenterai pas tout ton code car je n'ai pas trop le temps, mais ton problème vient d'ici:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// test des idantifiants
while ($donnees = $reponse->fetch())
{
if (htmlspecialchars($donnees['pseudo']) == htmlspecialchars($_POST['pseudo1']) )
{
    $pseudo_et_pass = true;
}

else
{
    $pseudo_et_pass = false;
}
}

Tu fais une boucle pour parcourir la BDD, et si le pseudo correspond à un pseudo dans la base, tu mets true, mais au prochain tour de boucle ça reviendra à false. (Donc en théorie seul le dernier inscrit peux se connecter).

De plus tu ne vérifie nul part le mot de passe…

WinXaito

Hum, je n'ai pas mis la vérification du mot de passe pour tester si déjà le pseudo était trouvé.

Pourquoi n'utilises pas une clause WHERE pour chercher directement l'utilisateur à partir de son pseudo ?

Très bonne remarque effectivement.

outre les htmlspecialchars qui ne servent à rien, que tu réexécutes htmlspecialchars sur la donnée POST à chaque itération et qu'il manquerait un break quand la correspondance sur le pseudo avait été établie

Heu, je n'ai pas vraiment compris

Ensuite, ta requête préparée, en l'état ne sert à rien puisqu'elle n'a aucun paramètre et quand on prépare une requête, elle ne fera quelque chose que quand tu l'exécuteras. Etape que tu as visiblement oublié.

okey

J'ai pris note de toutes vos remarque, mais concrètement, un code du plus basique qui va chercher si une information entrée par le visiteur (exemple du pseudo) existe déjà dans la base de donnée ou pas ressemble a quoi ? car je n'arrive pas a trouver ça et seulement ça "basiquement"

+0 -0

Cette réponse a aidé l'auteur du sujet

Heu, je n'ai pas vraiment compris

  1. htmlspecialchars c'est pour les XSS donc ça doit être fait uniquement à l'affichage. Ailleurs, ça n'a pas sa place.
  2. puisque tu fais htmlspecialchars($donnees['pseudo']) dans la boucle, tu le fais à chaque itération alors que tu aurais pu le faire une fois pour toute avant celle-ci
  3. dans ce genre de démarche, quand tu as établi la correspondance, au lieu de continuer à parcourir le restant des données, on quitte la boucle par un break; (ou alors, ici, on pouvait ajouter une condition à la boucle : while ($donnees = $reponse->fetch() && !$pseudo_et_pass). En plus, cette variable tu l'initialises jamais (bien qu'elle vaille implicitement NULL qui est une valeur fausse) et comme tu continues à parcourir ta table quand tu as trouvé ce que tu cherchais, tu écrases ta variable avec FALSE donc dans la suite de ton code, à moins que l'utilisateur tombe sur la dernière ligne renvoyée par la requête, elle sera toujours fausse

concrètement, un code du plus basique qui va chercher si une information entrée par le visiteur (exemple du pseudo) existe déjà dans la base de donnée ou pas ressemble a quoi ? car je n'arrive pas a trouver ça et seulement ça "basiquement"

Sérieusement ? Je suis sûr qu'on trouve ça partout.

1
2
3
4
5
6
7
8
<?php
$reponse = $bdd->prepare('SELECT * FROM membres WHERE pseudo = ?');
$reponse->execute([$_POST['pseudo1']]);
if ($user = $reponse->fetch()) {
    // utilisateur trouvé à partir de son nom, gérer la suite (mot de passe & co)
} else {
   // personne sous ce nom
}

Édité par vibrice

+0 -0
Auteur du sujet

Ah Nice !

Je te remercie énormément.

La au moins ça à la mérite d’être claire !

Je vais modifier le code.

(Ps; si ça ne t'ennui pas, je peux poster mon code " finie " ce weekend pour que tu me dise si il est juste ou pas ? )

Édité par TheLumMys

+0 -0
Auteur du sujet

||||Bonsoir, comme promis, voici le mon code :

Ici, le formulaire d'inscription :

 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
<?php
echo '<article class=inscription>';
?>
<?php
 include("menu.php"); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>inscription</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="inscription.css" rel="stylesheet" type="texte/css" />
</head>
<body class=inscription>
<br/>
<article>


Veuillez remplire ce formulaire d'inscription :<br/>
<p>
<form action="inscription_retourne.php" method="post">
<p>
<label for="pseudo1">Pseudo : </label>
<br/>
<input id="pseudo1" name="pseudo1" /><br/><br/>
</p>
<p>
<label for="pass01">Mot de passe : </label>
<br/>
<input id="pass01" type="password" name="pass01" /><br/><br/>
</p>
<p>
<label for="pass1">retapez le mot de passe : </label>
<br/>
<input id="pass1" type="password" name="pass1" /><br/><br/>
</p>
<p>
<label for="email1">Adresse email : </label>
<br/>
<input id="email1" name="email1" /><br/><br/>
</p>
<br/>
<br/>
<input type="submit" value="vérifier" />
</form>


</article>
</body>
</html>
<?php
echo '</article>';
?>

La page qui récupère les informations du formulaire :

 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
echo '<article class=contenu03>';
?>
<?php
 include("menu.php"); 
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>inscription</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="inscription.css" rel="stylesheet" type="texte/css" />
</head>
<body class=inscription_return>
<br/>


<?php

//On neutralise les eventuels balises introduites par l'utilisateur :

$_POST['pass1'] = htmlspecialchars($_POST['pass1']);
$_POST['pass01'] = htmlspecialchars($_POST['pass01']);
$_POST['email1'] = htmlspecialchars($_POST['email1']);
$_POST['pseudo1'] = htmlspecialchars($_POST['pseudo1']);

//hashage :

$_POST['pass1'] = sha1('gz'.$_POST['pass1']);
$_POST['pass01'] = sha1('gz'.$_POST['pass01']);

//c'est partie pour les vérifs! :

  if (isset($_POST['pass1']) AND $_POST['pass1'] != $_POST['pass01'])
      {
      echo '<div class=msgerreur><h1 class=msgerreur1>Oups !</h1></div><br/><br/>Erreur, Le mot de passe ne correspond pas au mot de passe de vérification. Merci de retaper le mot de passe<br/><br/><a href="inscription.php">Revenir a l\'inscription</a>';
      }
  else
      {
  
              if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['email1']))
          {
                  $pseudo = $_POST['pseudo1'];
                  $pass = $_POST['pass1'];
                  $email = $_POST['email1'];
                  try
                  {
                  $bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', '');
                  }
                  catch(Exception $e)
                  {
                  die('Erreur : '.$e->getMessage());
                  }
                  $req = $bdd->prepare('INSERT INTO membres(pseudo, pass, email, date_inscription) VALUES(:pseudo, :pass, :email, CURDATE())');
                  $req->execute(array( 
                  'pseudo' => $pseudo, 
                  'pass' => $pass,
                  'email' => $email));    
                  echo 'Succés ! vous étes bien enregistré(e) !<br/>Merci de vous connectez <a href="connextion.php">ICI</a>';        
          }
               else
                  {
                  echo '<div class=msgerreur><h1 class=msgerreur1>Oups !</h1></div><br/><br/>Erreur, Votre email n\'est pas valide. Merci de vérifier si il n\'y à pas d\'erreurs ou de prendre une autre adresse mail.<br/><br/><a href="inscription.php">Revenir a l\'inscription</a>';
                  }

      }


?>
</body>
</html>
<?php
echo '</article>';
?>

Ici mon formulaire de connexion :

 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
<?php
echo '<article class=contenu>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>connextion</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="all.css" rel="stylesheet" type="texte/css" />
</head>
<body class=connextion>
<?php include("menu.php"); ?>


         <form action="connextion_return.php" method="post">
             <p>
             <label for="pseudo1">Pseudo</label> : <input type="text" name="pseudo1" id="pseudo1" /><br/>
             <label for="pass2">pass</label> : <input type="password" name="pass2" id="pass2" /><br/>
             <input type="submit" value="Envoyer" />
             </p>
         </form>

       
<?php include("Pied_de_page.php"); ?>
</body>
</html>
<?php
echo '</article>';
?>

et la, la page qui récupère les informations du formulaire de connexion :

 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
<?php
/*
session_start();
*/
?>
<?php
echo '<article class=contenu>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>connextion</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="all.css" rel="stylesheet" type="texte/css" />
</head>
<body class=connextion_return01>
<?php include("menu.php"); ?>


<?php
//On neutralise les eventuels balises:
$_POST['pseudo1'] = htmlspecialchars($_POST['pseudo1']);
$_POST['pass2'] = htmlspecialchars($_POST['pass2']);

try
{
$bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$reponse = $bdd->prepare('SELECT * FROM membres WHERE pseudo = ?');
$reponse->execute([$_POST['pseudo1']]);

  if ($user = $reponse->fetch())    // utilisateur trouvé à partir de son nom, gérer la suite (mot de passe & co) 
  {
              //on envoi la suite !
              $_POST['pass2'] = sha1('gz'.$_POST['pass2']);
              $reponse = $bdd->prepare('SELECT * FROM membres WHERE pass = ?');
              $reponse->execute([$_POST['pass2']]);
              
              if ($user = $reponse->fetch())    // Mdp ok !, gérer la suite
              {
                  echo 'Bravos !!! tout est bon !';
              }
              
              else   //mauvais mdp
              {
                  echo '<br/><br/>Oups ! le mot de passe n\'est pas bon !';
              }
          
  }
  
  else   // personne sous ce nom
  {
          echo '<br/><br/>Oups ! le pseudo n\'existe pas';
    }
?>


<?php include("Pied_de_page.php"); ?>
</body>
</html>
<?php
echo '</article>';
?>

Il y aurait des erreurs ? des choses à corriger ? à mieux sécuriser ? (ps, je travaille sur l'implantation du captcha).

Édité par TheLumMys

+0 -0

Comment peux-tu faire une requête sur le hash du mot de passe ? Pourquoi n'utilises-tu pas les infos de la première requête sur le pseudo ? Là c'est cool, on peut se connecter sous n'importe quel pseudo et n'importe quel mot de passe …

Tes htmlspecialchars ne servent à rien (les XSS c'est à l'affichage).

Du sha1 avec 'gz' en grain de sel, c'est vraiment très insuffisant.

C'est pour faire quoi le echo '<article class=contenu>'; qui se balade avant le doctype ?

Édité par vibrice

+0 -0
Auteur du sujet

C'est pour faire quoi le echo '<article class=contenu>'; qui se balade avant le doctype ?

Pour ma fiche CSS.

Comment peux-tu faire une requête sur le hash du mot de passe ? Pourquoi n'utilises-tu pas les infos de la première requête sur le pseudo ? Là c'est cool, on peut se connecter sous n'importe quel pseudo et n'importe quel mot de passe …

C'est étrange, pourtant, en faisant les test il n'y a pas de problèmes sur ce niveau la (je ne comprend pas vraiment ce qu'il faudrait faire).

Du sha1 avec 'gz' en grain de sel, c'est vraiment très insuffisant.

Ah, comment je devrais faire pour que ce soit bien sécurisé ?

Tes htmlspecialchars ne servent à rien (les XSS c'est à l'affichage).

Ah, je croyais que l'on pouvais envoyer du scripte pour par exemple voler des cookies …, même par mesure de sécurité ?

Édité par TheLumMys

+0 -0

C'est pour faire quoi le echo '<article class=contenu>'; qui se balade avant le doctype ?

Pour ma fiche CSS.

Jamais rien avec le <DOCTYPE ...>

Tes htmlspecialchars ne servent à rien (les XSS c'est à l'affichage).

Ah, je croyais que l'on pouvais envoyer du scripte pour par exemple voler des cookies …, même par mesure de sécurité ?

Le risque c'est quand tu affiches sur l'écran, je t'invite à essayer ces deux codes:

Sur une page

1
2
<?php   
echo '<script>alert("Faille XSS")</script>';

Et ceci sur une autre page

1
2
<?php
echo htmlspecialchars('<script>alert("Faille XSS")</script>');

Et tu compares.

Édité par WinXaito

+1 -0

C'est étrange, pourtant, en faisant les test il n'y a pas de problèmes sur ce niveau la (je ne comprend pas vraiment ce qu'il faudrait faire).

Si je ne m'abuse, si tu crées 2 utilisateurs tel que :

  • login : A, mot de passe : A
  • login : B, mot de passe : B

En l'état tu dois pouvoir t'identifier en tant que A (pour login) mais B pour mot de passe et vice-versa.

Ah, comment je devrais faire pour que ce soit bien sécurisé ?

Pourquoi réinventer la roue ? Il y a les fonctions password_hash & cie qui gère simplement et correctement ça pour toi.

Ah, je croyais que l'on pouvais envoyer du scripte pour par exemple voler des cookies …, même par mesure de sécurité ?

La sécurité ce n'est pas faire des traitements au petit bonheur la chance mais appliquer LE bon au bon endroit. Il faut prendre en compte le contexte. Une XSS, par définition, n'a lieu que sur de l'affichage (echo entre autres) dans un contexte HTML (Content-Type: text/html) où le client interprèteraient les balises non désirées (exemple : le résultat d'un SELECT que tu lui rebalances gaiement et qui n'est pas censé être en HTML mais que tu n'as ni contrôlé ni désactivé par htmlspecialchars - à l'affichage évidemment et non à l'INSERT) car, pour lui, elles feraient partie intégrante de ta page et va l'interpréter comme le reste. Dans un autre contexte, comparaison en PHP (comme tu l'avais fait intialement), requête SQL (où on sera bien évidemment concerné par les risques d'injections SQL), etc, ça n'a pas sa place puisque ce n'est pas à ce moment/endroit qu'une XSS est possible. Sinon, au mieux, c'est des traitements inutiles ; au pire :

  • tu dénatures inutilement tes données (genre : pourquoi stocker &lt; au lieu de simplement < ? Ca te prend 4 fois plus de place sur cet exemple, ça rend inutilement plus difficile une recherche dessus si jamais tu en avais le besoin sans compter que si tu les reprends pour du non HTML, il faut appliquer un html_entity_decode avant, etc)
  • ce raisonnement peut te valoir des XSS justement : il vaut mieux les mettre systématiquement où il y en a besoin que d'éventuellement en oublier parce que tu ne sais plus si tu l'as fait dans ton code en amont ou pas

Édité par vibrice

+0 -0
Auteur du sujet

Si je ne m'abuse, si tu crées 2 utilisateurs tel que : login : A, mot de passe : A login : B, mot de passe : B En l'état tu dois pouvoir t'identifier en tant que A (pour login) mais B pour mot de passe et vice-versa.

Ah oui, exacte !, je fais comment pour relier le pseudo est le mot de passe alors ?

+0 -0

Pas à faire une deuxième requête, il y a juste à comparer sha1('gz'.$_POST['pass2']) avec $user['pass'] (dans le if sur le résultat du fetch de la première).

Pour des questions de sécurité, je n'aurais pas dit si c'est le login et/ou le mot de passe qui est faux.

Édité par vibrice

+0 -0
Auteur du sujet

Pas à faire une deuxième requête, il y a juste à comparer sha1('gz'.$_POST['pass2']) avec $user['pass'] (dans le if sur le résultat du fetch de la première).

Okey, je vois ça demain !

Pour des questions de sécurité, je n'aurais pas dit si c'est le login et/ou le mot de passe qui est faux.

Oui, c'est vrai ! mais après tous, le login est publiques. Après a voir, mais logiquement, si le pseudo est faux, le code ne dira jamais que le mot de passe est juste ou pas.

Édité par TheLumMys

+0 -0
Auteur du sujet

Bonsoir, J'ai tenter de corriger le problémes sans succès, ça fait un moment que je cherche pourquoi ça ne fonctionne pas … . C'est pour ça que j'en reviens a vous. Ou serait l'erreur ?

 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
<?php
/*
session_start();
*/
?>
<?php
echo '<article class=contenu>';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>connextion</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link href="all.css" rel="stylesheet" type="texte/css" />
</head>
<body class=connextion_return01>
<?php include("menu.php"); ?>


<?php
//On neutralise les eventuels balises:
$_POST['pseudo1'] = htmlspecialchars($_POST['pseudo1']);
$_POST['pass2'] = htmlspecialchars($_POST['pass2']);
$_POST['pass2'] = sha1('gz'.$_POST['pass2']);

try
{
$bdd = new PDO('mysql:host=localhost;dbname=tests', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$reponse = $bdd->prepare('SELECT * FROM membres WHERE pseudo = ? AND pass = ?');
$reponse->execute(array([$_POST['pseudo1']], [$_POST['pass2']]));

  if ($user = $reponse->fetch())    // utilisateur trouvé à partir de son nom et mdp, gérer la suite :
  {
                  echo 'Bravos !!! tout est bon !';
  }
  else   // personne sous ce nom
  {
          echo '<br/><br/>Oups ! le pseudo n\'existe pas ou le mot de passe est incorecte.';
    }
?>


<?php include("Pied_de_page.php"); ?>
</body>
</html>
<?php
echo '</article>';
?>

+0 -0

Ligne 35, pourquoi tu mets chaque valeur dans un tableau séparé avant de remettre le tout dans un tableau ? (je rappelle que [ ... ] équivaut à array( ... ) depuis PHP 5.4.0). Tout devrait être dans un même et unique tableau à une dimension et cette erreur devrait apparaître, avec un environnement de développement convenablement configuré, par des E_NOTICE "Array to string conversion".

Ce serait une bonne idée de tester au préalable que tes variables POST existent (isset).

Enfin, je le redis une dernière fois, tes htmlspecialchars sont inutiles. Le pauvre utilisateur qui aurait l'idée d'utiliser des caractères comme <, > et & dans son mot de passe risque de ne jamais pouvoir se connecter [si ce n'est pas inutilement fait aussi à son inscription].

Édité par vibrice

+0 -0
Auteur du sujet

Ce serait une bonne idée de tester au préalable que tes variables POST existent (isset).

Comme ça ? : php (isset($_POST['pseudo1']) AND $_POST['pseudo1'] == "pseudo")

(Ps: je commence vraiment à être perdu … ça serai possible d'avoir des exemples ?)

Édité par TheLumMys

+0 -0

Salut,

Je pense que tu as surtout un problème de conception. As-tu pris le temps de réfléchir à ce que tu voulais et comment l'obtenir ?

Concrètement, tu as un formulaire avec deux champs. La première des choses serait de vérifier que ces champs aient bien été remplis. Si oui, tu continues. La deuxième chose est de récupérer dans la BDD la ligne correspondant au pseudo du formulaire ; si cette ligne existe, comment peux-tu vérifier que le mot de passe du formulaire est bien celui présent en BDD ? Et si les 2 mot de passe existent, comment connecter le membre ?

Concrètement, tu n'as besoin de rien de plus. Je te conseille de prendre une feuille de papier, un crayon, et d'écrire ça sous forme de pseudo code en français :

1
2
3
4
Si mes champs sont bien remplis
    Je récupère la ligne en BDD
    Si les mots de passes sont identiques
        ...

Ensuite tu « traduis » ça en PHP. Ne pense pas à la sécurité ou à je ne sais quoi. Dans un premier temps, fais au plus simple ; par la suite tu pourras améliorer le script, quand le premier jet fonctionne.

+1 -0

Comme ça ? : (isset($_POST['pseudo1']) AND $_POST['pseudo1'] == "pseudo")

As-tu essayé ton propre code ? A moins de s'appeler pseudo, ton site n'est pas prêt d'avoir la moindre activité … Tu veux que la variable existe simplement, elle doit donc pouvoir avoir un contenu quelconque (cela dit ayant POST pour origine ce sera forcément une chaîne). De toute façon, tu vérifies après que ce pseudo qu'on t'a donné correspond à quelqu'un ou non. Pourquoi le tester pour le forcer à la valeur "pseudo" ? isset n'est-il pas suffisant pour ne tester que son existence ? (à la rigueur !empty mais pas plus)

Édité par vibrice

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte