8768 sujets

Développement web côté serveur, CMS

Bonjour,
Je reviens vers vous avec un autre souci pour lequel je vous demande de l'aide.
J'ai une page login comme suit :

<?php
if (!empty($_POST['mailclient']) and !empty($_POST['pwdclient'])) {
    $mailclient      = $_POST['mailclient'];
    $pwdclient      = $_POST['pwdclient'];
    $verif = $bdd->prepare('SELECT * FROM client WHERE mailclient= :mailclient AND pwdclient= pwdclient');
    $verif->execute(array('mailclient' => $mailclient, 'pwdclient' => $pwdclient));
    $cpte = $verif->rowCount();

    if ($cpte == 0) {
        echo '<h2 class="alert-danger text-center">Votre login et/ou votre mot de passe est incorrect</h2>';
    } else {
        echo "<script> window.location.replace('espace_client.php') </script>";
        exit();
    }
}

Elle fonctionne bien, avec les bons login et pw, j'arrive sur la bonne page.
Le problème est lorsque soit le login, soit le mot de passe ou les deux sont faux, j'arrive tout de même sur la page espace_client.php seulement tous les liens de cette page sont erronés et donc elle n'est pas exploitable et mon message d'erreur ne s'affiche pas comme il devrait le faire ....
Savez-vous pourquoi ?
D'avance merci de votre aide, cordialement ++
Modifié par Loutschi (18 Apr 2022 - 12:57)
Modérateur
Hello,

Je passe en coup de vent. Relis bien ceci :

//....
$verif = $bdd->prepare('SELECT * FROM client WHERE mailclient= :mailclient AND pwdclient= pwdclient');
//....


ps :
- La variable qui se nomme verif ? Je pense plutôt qu'il est préférable de la nommer query
- mot de passe en clair ? Smiley hum
- redirection en JS, c'est le mal ! Utilise plutôt header(). Ce sera nettement plus propre.

//...
echo "<script> window.location.replace('espace_client.php') </script>";
// ...

Modifié par niuxe (19 Apr 2022 - 05:51)
Bonjour niuxe,
Mille mercis de ton retour rapide (un jour férié, très sympa !),

J'ai modifié la variable avec $query et modifié le retour avec header comme suit, mais ça ne change rien, je suis tout de même redirigé vers ma page espace_client , même si je saisi un faux MDP ou pas de MDP du tout, je ne comprend pas opù j'ai fait une erreur , et pourtant !!

<?php
if (!empty($_POST['mailclient']) and !empty($_POST['pwdclient'])) {
    $mailclient      = $_POST['mailclient'];
    $pwdclient       = $_POST['pwdclient'];
    $query = $bdd->prepare('SELECT * FROM client WHERE mailclient= :mailclient AND pwdclient= [langue]wdclient');
    $query->execute(array('mailclient' => $mailclient, 'pwdclient' => $pwdclient));
    $cpte = $query->rowCount();

    if ($cpte == 0) {
        echo '<h2 class="alert-danger text-center">Votre login et/ou votre mot de passe est incorrect</h2>';
    } else {
        header('location: espace_client.php');
        exit();
    }
}


Tu aurais une autre idée ?

D'autre part, je ne comprends pas non plus pourquoi tu dis que le MDP est en clair, sur mon formulaire j'ai mis un champs password pour qu'il soit caché, comme suit :
upload/1650352488-84072-inkedcapturedancran2022-04-19.jpg
Modifié par Loutschi (19 Apr 2022 - 09:14)
Bonjour,

Si tu es redirigé, c'est que $cpte ne vaut pas 0, et donc que le $query->rowCount() renvoie autre chose que 0.

Dans ta requête, tu devrais écrire:
pwdclient=:pwdclient
et non
pwdclient= [langue]wdclient

Comme ça, le mot de passe qui arrive en POST sera utilisé dans la requête.

Pour l'histoire du mot de passe en clair, ça veut dire que tu écris le mot de passe dans ta table sans l'encrypter d'aucune manière. En général, on stocke des mots de passe cryptés dans les bases de données, et dans la requête, tu devrais donc tester par exemple
pwdclient=md5(:pwdclient)
Cela veut dire qu'au moment d'écrire le mot de passe dans ta table, tu aurais inséré un mot de passe encrypté: md5(pwdclient).

... J'ai mis md5 parce que je me souvenais de la syntaxe facile, mais ce n'est pas le plus recommandé je crois.

Ici, quelques solutions:
https://zinoui.com/blog/storing-passwords-securely
Modifié par loicbcn (19 Apr 2022 - 10:39)
Bonjour loicbcn,

Merci pour ta réponse.
Oui, j'ai bien compris que $cpte ne vaut pas 0, d'où le problème.
Mais dans mon script, j'ai bien écrit pwdclient=:pwdclient', j'ai dû faire une erreur lorsque j'ai copié/collé mon script dans mon premier mressage.
Voici mon code correct :

<?php
if (!empty($_POST['mailclient']) && !empty($_POST['pwdclient'])) {
    $mailclient      = $_POST['mailclient'];
    $pwdclient       = $_POST['pwdclient'];
    $query = $bdd->prepare('SELECT * FROM client WHERE mailclient=:mailclient AND pwdclient=:pwdclient');
    $query->execute(array('mailclient' => $mailclient, 'pwdclient' => $pwdclient));
    $cpte = $query->rowCount();

    if ($cpte == 0) {
        echo '<h2 class="alert-danger text-center">Votre login et/ou votre mot de passe est incorrect</h2>';
    } else {
        header('location: espace_client.php');
        exit();
    }
}


Pour ce qui est du mot de passe, oui il est clair que je dois le crypter avec un hash, ce que je vais faire au plus vite. Merci de m'avoir rendu attentif à cela.

Au-delà de ça, donc mon souci reste entier.
Apparemment, rowCount() ne renvoie pas le nombre de lignes du résultat, mais le nombre de lignes affectées par la dernière requête ... https://www.php.net/manual/fr/pdostatement.rowcount.php

Donc, fais plutôt une requête "count", pour compter le nombre de lignes, ou teste si ta requêtre renvoie quelque chose, du genre
if ( $query->fetch() ){
    ...
}

Modifié par loicbcn (19 Apr 2022 - 14:51)
Modérateur
Perso, je vois encore 2 soucis :


$cpte = $query->rowCount();

    if ($cpte == 0) {



$result = $query->fetch();

if(!$result){
    // erreur login
}else{
    // redirection dashboard
}
Re Bonjour,

Merci de ton aide et du temps passé à tes recherches.
Les différents soucis que tu as trouvés sont en fait des mauvais copié/collé.

Par contre j'ai effectué plusieurs tests et j'ai remarqué des points qui pourraient être des pistes de solutions.
Je m'explique :
Le script tel que je l'ai écrit fonctionne très bien sur un autre site, pas de soucis à ce niveau.
Mais j'ai vu qu'il y a des choses bizarres au niveau de mon formulaire, sachant que le but est de se connecter à une page nommée espace_client.php
1°) Tout ce que j'ai expliqué comme problèmes, arrive lorsque je saisi le nom de la page de redirection dans action exemple :

form id="admin-form" data-toggle="validator" method="post" action="espace_client.php" role="form">

2°) Par contre si je saisis le nom de la page sur laquelle je suis, ou si je laisse en blanc le champ action, et si je saisi un faux MDP, le message d'erreur s'affiche correctement comme ci-dessous :


Et si je saisi le bon MDP, je suis bien redirigé vers ma page espace_client.php, mais elle ne récupère pas les données du $_POST.

form id="admin-form" data-toggle="validator" method="post" action="" role="form">

Voici un bout de la page de redirection en question :
upload/1650374419-84072-capturedancran2022-04-1915195.png
Ce n'est pas évident à expliquer j'espère que vous comprennez ce que je veux dire.

Donc d'après moi je pense que c'est à ce nuveau que le problème se situe.
Vous ne croyez pas ?
Alors là chapeau bas Monsieur Smiley merci , c'est bien ça
J'envoie mes données depuis la page login :

<?php session_start();
$_SESSION['mailclient'] = $_POST['mailclient'];
$_SESSION['pwdclient'] = $_POST['pwdclient'];
?>

Et je récupère mes données dans ma page espace_client.php comme ceci

if (!empty($_SESSION['mailclient'])) {
  $mailclient = ($_SESSION['mailclient']);
  $statement = $bdd->prepare("SELECT * FROM client WHERE mailclient = ?");
  $statement->execute(array($mailclient));
  $item = $statement->fetch();
  $pwdclient      = $item['pwdclient'];
  $mailclient     = $item['mailclient'];
  $prenomclient   = $item['prenomclient'];
  $prenomconjoint = $item['prenomconjoint'];
  $nomconjoint    = $item['nomconjoint'];
  $nomclient      = $item['nomclient'];
}

Super génial, mille mercis grâce à toi tout fonctionne correctement. J'avoue que je n'aurais jamais trouvé tout seul Smiley ravi .

Me reste plus qu'à sécuiser mes MDP, mais ça j'ai déjà fait, je devrais y arriver.
Belle journée à toi et encore merci.
Meilleure solution