8768 sujets

Développement web côté serveur, CMS

Bonjour à Tous,

Je suis en train de perdre mon latin !!!
Dans le code ci-après je fais 3 tests :
Syntaxe du $_POST['password'] pas bonne
$_POST['password'] = $_POST['password_confirm']
Requête $pdo conforme

Pour chaque test je cherche à afficher un message avec $_SESSION['flash']…. Et mon problème se situe à ce niveau.

Le message relatif à la conformité de
$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?')->execute([$password, $_GET['id']]);
S’affiche normalement dans header('Location: login.php');

Les messages relatifs aux tests
Syntaxe du $_POST['password'] pas bonne
$_POST['password'] différent de $_POST['password_confirm']
ne s’affichent pas, je voudrai qu’ils s’affiche dans la page régie par le code ci-après.



  if(!empty($_POST)){
		    if(!empty($_POST['password']) && $_POST['password'] == $_POST['password_confirm']){	
					
		session_start();	
		if( (!preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{8,12}$/', $_POST['password'])) )
	$_SESSION['flash']['error'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';
                exit();    						

                $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
                $pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?')->execute([$password, $_GET['id']]);					
				session_start();				
                $_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié<br>Vous pouvez maintenant accéder à l\'Espace Membre';
                $_SESSION['auth'] = $user;
                header('Location: account.php');
                exit();
            }else{	
			$_SESSION['flash']['error'] = 'Les mots de passe ne sont pas identiques';					
			}					
  }
    }else{
        session_start();
        echo $_SESSION['flash']['error'] = "Ce token n'est pas valide";
        header('Location: login.php');
        exit();
    }
}else{
    header('Location: login.php');
    exit();
}


Merci par avance pour votre aide
Cordialement
Patrick Mara
Modérateur
Eh low,

je passe en coup de vent. Avant header location, que vaut print_r($_SESSION) ?
Bonjour à Tous,

Je viens de faire évoluer mon code.
Tout fonctionne, en cas d'erreur, on reste bien bloqué sur la page mais je n'ai toujours pas l'affichage des messages d'erreur :

[code=php]$_SESSION['flash']['error'] = 'Les mots de passe ne sont pas identiques';	
$_SESSION['flash']['error'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';


Merci par avance pour votre aide
Cordialement
Patrick Mara


if( (preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{8,12}$/', $_POST['password']))){

if(!empty($_POST['password']) && $_POST['password'] == $_POST['password_confirm']){

$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?')->execute([$password, $_GET['id']]);
session_start();
$_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié<br>Vous pouvez maintenant accéder à l\'Espace Membre';
$_SESSION['auth'] = $user;
header('Location: account.php');
exit();
}else{
$_SESSION['flash']['error'] = 'Les mots de passe ne sont pas identiques';
}
}else{
$_SESSION['flash']['error'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';
}[/code]
Modérateur
ton code n'est pas terrible. J'ai vu pleins d'erreurs :
- Tu omets les accolades
- l'indentation laisse à desirer
- echo avant header
- $user, c'est quoi cette variable ?
- $_GET['id'] ??

voici le correctif :
index.php

<?php 
    session_start();
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="./controller.php" method="post">
        <div class="input password"><label for="pass1">pass1</label><input type="password" name="password" id="pass1"></div>
        <div class="input password"><label for="pass2">pass2</label><input type="password" name="password_confirm" id="pass2"></div>
        <button type="submit">vas y</button>
    </form>
    P@ssw0rd
</body>
</html>


controller.php

<?php
    if(!empty($_POST)){
        session_start();
        $_SESSION = [];
        if(!empty($_POST['password']) && $_POST['password'] === $_POST['password_confirm']){
            if( (!preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{8,12}$/', $_POST['password'])) ){
                $_SESSION['flash']['error'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';
            }
            $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
            // $pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?')->execute([$password, $_GET['id']]);                
            $_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié<br>Vous pouvez maintenant accéder à l\'Espace Membre';
            //$_SESSION['auth'] = $user;
            header('Location: account.php');
        }else{
            $_SESSION['flash']['error'] = "Ce token n'est pas valide";
            header('Location: index.php');
        }
    }else{
        header('Location: index.php');
    }
?>


account.php

<?php 
    session_start();
    echo '<pre>';
    print_r($_SESSION);
    echo '</pre>';
?>

Modifié par niuxe (27 Apr 2021 - 14:58)
Bonjour Niuxe,

Merci de porter intérêt à mon sujet.

Je sais mon code est mal foutu, mais je ne suis qu'un amateur un peu éclairé qui se débrouille pour une association avec les logiciels dont je dispose
Vous me retournez en solution avec 3 codes que j'ai du mal à cerner.
Ci-dessus voilà le code entier de la page.

Ce code fonctionne parfaitement sauf que :
$_SESSION['flash']['error'] = 'Les mots de passe ne sont pas identiques';
$_SESSION['flash']['error'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';

n'affiche rien mais je reste bloqué sur la page ce qui est normal.
Avec echo dans :
echo $_SESSION['flash']['error'] = 'Les mots de passe ne sont pas identiques';
echo $_SESSION['flash']['error'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';

j'obtiens l'affichage des messages d'erreur mais au dessus de la page et pas dans la page avec un format spécifique.

La solution est proche mais je ne la vois pas.

Merci pour votre aide
Cordialement
Patrick Mara



<?php
if(isset($_GET['id']) && isset($_GET['token'])){
    require 'inc/db.php';
    require 'inc/functions.php';
    $req = $pdo->prepare('SELECT * FROM users WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)');
    $req->execute([$_GET['id'], $_GET['token']]);
    $user = $req->fetch();
    if($user){

        if(!empty($_POST)){
			
			if( (preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{8,12}$/', $_POST['password']))){
		
				if(!empty($_POST['password']) && $_POST['password'] == $_POST['password_confirm']){	
  						
					$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
					$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?')->execute([$password, $_GET['id']]);					
					session_start();				
					$_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié<br>Vous pouvez maintenant accéder à l\'Espace Membre';
					$_SESSION['auth'] = $user;
					header('Location: account.php');
					exit();
				}else{
					echo $_SESSION['flash']['error'] = 'Les mots de passe ne sont pas identiques';					
				}
  			}else{				
				echo $_SESSION['flash']['error'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';
			}
							
  }

    }else{
        session_start();
        $_SESSION['flash']['error'] = "Ce token n'est pas valide";
        header('Location: login.php');
        exit();
    }
}else{
    header('Location: login.php');
    exit();
}
?>
<?php require 'inc/header.php'; ?>
<h1>Réinitialiser mon mot de passe</h1>
<p class="info">Votre mot de passe doit comporter : 8 à 12 caractères, majuscule, 
  minuscule, chiffre, caractère spécial<br>En dehors de cette contrainte vous avez le libre choix de votre mot de passe<br>Si vous restez bloqué sur cette page c'est que :<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vos mots de passe ne sont pas identiques<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vous ne respectez pas la syntaxe 8 à 12 caractères etc</p>
<form action="" method="POST">
  <div class="form-group"> 
    <label for="">Mot de passe</label>
    <input type="password" name="password" class="form-control"/>
  </div>
  <div class="form-group"> 
    <label for="">Confirmation du mot de passe</label>
    <input type="password" name="password_confirm" class="form-control"/>
  </div>
  <button type="submit" class="btn btn-primary">Réinitialiser votre mot de passe</button>
</form>
<?php require 'inc/footer.php'; ?>
Modérateur
J'avais à peu près compris le contexte de ton code (reset ou inscription). Les points que j'ai relevés pointent les défaillances. Par exemple, tu ne peux pas avoir $_GET et $_POST. Bien sûr, tu as dans ce cas-là $_REQUEST. Cette super globale est à bannir à tout jamais. Pourquoi ? Pour un trou béant de sécurité. Tu veux récupérer l'id du user, dans ce cas-là il doit être inclus dans un input type hidden. Mais attention, ça doit être fait dans son espace.

Ce que je te conseille : tu testes le code que je t'ai soumis dans un environnement à part. Ensuite tu adaptes à ta situation. je vois aussi que tu fais un système de token. Idem, tu inclues ce token dans un input type hidden. C'est aussi la même chose : attention, ça doit être fait dans l'espace utilisateur.
Bonjour à Tous,

Jai finalement trouvé.
Compte tenu du contexte, j'ai remplacé
$_SESSION['flash']['error']
par
$_SESSION['flash']['danger']


$_SESSION['flash']['danger'] = 'Les mots de passe ne sont pas identiques';
$_SESSION['flash']['danger'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';

Et tout s'affiche normalement.
Le code complet :

<?php
if(isset($_GET['id']) && isset($_GET['token'])){
    require 'inc/db.php';
    require 'inc/functions.php';
    $req = $pdo->prepare('SELECT * FROM users WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)');
    $req->execute([$_GET['id'], $_GET['token']]);
    $user = $req->fetch();
    if($user){

        if(!empty($_POST)){
			
			if( (preg_match('/^(?=.*[A-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@])\S{8,12}$/', $_POST['password']))){
		
				if(!empty($_POST['password']) && $_POST['password'] == $_POST['password_confirm']){	
  						
					$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
					$pdo->prepare('UPDATE users SET password = ?, reset_at = NULL, reset_token = NULL WHERE id = ?')->execute([$password, $_GET['id']]);					
					session_start();				
					$_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié<br>Vous pouvez maintenant accéder à l\'Espace Membre';
					$_SESSION['auth'] = $user;
					header('Location: account.php');
					exit();
				}else{
					session_start();
					$_SESSION['flash']['danger'] = 'Les mots de passe ne sont pas identiques';					
				}
  			}else{
				session_start();				
				$_SESSION['flash']['danger'] = 'Votre mot de passe doit contenir entre 8 et 12 caractères etc ...';
			
			}
							
  }

    }else{
        session_start();
        $_SESSION['flash']['error'] = "Ce token n'est pas valide";
        header('Location: login.php');
        exit();
    }
}else{
    header('Location: login.php');
    exit();
}
?>
<?php require 'inc/header.php'; ?>
<h1>Réinitialiser mon mot de passe</h1>
<p class="info">Votre mot de passe doit comporter : 8 à 12 caractères, majuscule, 
  minuscule, chiffre, caractère spécial<br>En dehors de cette contrainte vous avez le libre choix de votre mot de passe</p>
<form action="" method="POST">
  <div class="form-group"> 
    <label for="">Mot de passe</label>
    <input type="password" name="password" class="form-control"/>
  </div>
  <div class="form-group"> 
    <label for="">Confirmation du mot de passe</label>
    <input type="password" name="password_confirm" class="form-control"/>
  </div>
  <button type="submit" class="btn btn-primary">Réinitialiser votre mot de passe</button>
</form>
<?php require 'inc/footer.php'; ?>


Merci à ceux qui ont pris du temps pour intervenir sur ce sujet.
Cordialement
Patrick Mara