IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Je n'arrive pas à mettre au point ma page de connexion avec les cookies


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 700
    Points : 857
    Points
    857
    Par défaut Je n'arrive pas à mettre au point ma page de connexion avec les cookies
    Bonjour,
    J'ai une page de connexion sans tous les cookies qui fonctionne et une page avec cookies qui ne marche pas.
    Page qui fonctionne:
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <?php declare(strict_types=1);
     
    if( empty( session_id() ) )
    	session_start();
     
    $_SESSION = array_intersect_key($_SESSION, ['language'=>'', ]);
     
    require_once "view/lang/{$_SESSION['language']}.php";
    require_once "config.php";
    require_once "model/model.php";
     
    // Set default values
    $errors	= [];
     
    $page = $_COOKIE['startPage'] ?? 'family';
     
    $demo = isset($_GET['demo']) ? true: false;
     
    if($demo)
    	$User = getUser('login', 'demo');
    else {
    	$post = $_POST;
    	$login	= trim($post['login']);
    	$pw		= trim($post['pw']);
     
    	// Controls
    	//.................................................................................................................................
     
    	// Missing login
    	if ( empty($post['login']) )
    		$errors[] = $textes['error_2'];
     
    	// Missing password
    	if ( empty($post['pw']) )
    		$errors[] = $textes['error_4'];
     
    	// Read table 'dat_users' from database
    	$User = getUser('login', $login);
     
    	// Wrong login
    	if( ! $User ) {
    		$errors[] = $textes['error_6'];
    	} else {
    		// Case sensitive control (because MySQL is case insensitive)
    		if($login !== $User['login'])
    			$errors[] = $textes['error_8'];
     
    		// Wrong password
    		if ( $post['pw'] && ! password_verify($pw, $User['hash']) )
    			$errors[] = $textes['error_10'];
     
    		// User is banned
    		if ($User['banned'])
    			$errors[] = $textes->error_12;
     
    		// User is not confirmed
    		if (empty($User['checked']))
    			$errors[] = $textes->error_14;
    	}
     
    }
     
    //.....................................................................................................................................
     
    // Errors handler
    if ( count($errors) )
    	$User = false;
     
    // Store info in session
    $_SESSION['errors'] = $errors;
    $_SESSION['user'] = $User;
    $_SESSION['demo'] = $User['id_abo'] === 1 ? true: false;
     
    if($User) {
    	$page = $_COOKIE['startPage'] ?? $page;
     
    	if( isset($post['memory']) )
    		setcookie('code', (string) $User['id'], time() + 60*24*3600);
    	else
    		setcookie('code', '', time() - 1);
    } else {
    	$page = 'home';
    }
     
    header("Location: index.php?page={$page}");
    Page qui ne fonctionne pas:
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    <?php declare(strict_types=1);
     
    if( empty( session_id() ) )
    	session_start();
     
    $_SESSION = array_intersect_key($_SESSION, ['language'=>'', ]);
     
    require_once "view/lang/{$_SESSION['language']}.php";
    require_once "config.php";
    require_once "model/model.php";
     
    // Set default values
    $errors	= [];
    $page = $_COOKIE['startPage'] ?? 'family';
    $User = false;
     
    $demo = isset($_GET['demo']) ? true: false;
     
    // Cas particulier de la version démo
    if($demo)
    	$User = getUser('login', 'demo');
    // Cas où l'utilisateur s'est enregistré
    elseif( !empty($_COOKIE['code']) ) {
    	$User = getUser('id', $_COOKIE['code']);
    // Cas où l'utilisateur n'est pas enregistré et n'a pas saisi ses codes d'accès
    } elseif( empty($_COOKIE['code']) && empty($_POST) ) {
    	$page = 'home';
    // Cas où l'utilisateur a saisi ses codes d'accès
    } else {
    	$post = $_POST;
    	$login	= trim($post['login']);
    	$pw		= trim($post['pw']);
     
    	// Controls
    	//.................................................................................................................................
     
    	// Missing login
    	if ( empty($post['login']) )
    		$errors[] = $textes['error_2'];
     
    	// Missing password
    	if ( empty($post['pw']) )
    		$errors[] = $textes['error_4'];
     
    	// Read table 'dat_users' from database
    	$User = getUser('login', $login);
     
    	// Wrong login
    	if( ! $User ) {
    		$errors[] = $textes['error_6'];
    	} else {
    		// Case sensitive control (because MySQL is case insensitive)
    		if($login !== $User['login'])
    			$errors[] = $textes['error_8'];
     
    		// Wrong password
    		if ( $post['pw'] && ! password_verify($pw, $User['hash']) )
    			$errors[] = $textes['error_10'];
     
    		// User is banned
    		if ($User['banned'])
    			$errors[] = $textes->error_12;
     
    		// User is not confirmed
    		if (empty($User['checked']))
    			$errors[] = $textes->error_14;
    	}
     
    }
     
    //.....................................................................................................................................
     
    // Errors handler
    if ( count($errors) )
    	$User = false;
     
    // Store info in session
    $_SESSION['errors'] = $errors;
    $_SESSION['user'] = $User;
    $_SESSION['demo'] = $User['id_abo'] === 1 ? true: false;
     
    if($User) {
    	$page = $_COOKIE['startPage'] ?? $page;
     
    	if( isset($post['memory']) )
    		setcookie('code', (string) $User['id'], time() + 60*24*3600);
    	else
    		setcookie('code', '', time() - 1);
    } else {
    	$page = 'home';
    }
     
    header("Location: index.php?page={$page}");
    Cette page provoque l'affichage d'une page d'erreur
    genealium.proginet.local vous a redirigé un trop grand nombre de fois.
    essayez de supprimer vos cookies.
    Pourquoi ai-je cette erreur maintenant, alors que la version précédente fonctionnait sans problème sans nouvelle redirection.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 290
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 290
    Points : 8 609
    Points
    8 609
    Billets dans le blog
    17
    Par défaut
    La redirection doit boucler indéfiniment. Comment est appelé ce script ?

    Vérifie si la valeur de page correspond bien à l'attendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exit("[DEBUG] page={$page}");
    header("Location: index.php?page={$page}");
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 700
    Points : 857
    Points
    857
    Par défaut
    L'erreur se situe au niveau de la ligne 27 car 'home' est la page appelante. J'ai donc essayé de réécrire les lignes suivantes. Mais là, je bute sur la façon de les écrire pour envisager tous les cas de figure:
    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
    // special case of demoset
    if($demo) {
    	setcookie('code', '', time() - 1);
    	setcookie('startPage', '', time() - 1);
    	setcookie('savePerson', '', time() - 1);
    	setcookie('idMain', '', time() - 1);
    	$page = 'family';
    	$User = getUser('login', 'demo');
    }
    // user was already registred
    elseif( !empty($_COOKIE['code']) ) {
    	$User = getUser('id', $_COOKIE['code']);
    // user was not already registred and did not give login inputs
    } elseif( empty($_COOKIE['code']) && empty($_POST) ) {
    	$page = 'home';
    // user has just given login inputs
    } else {
    	$post = $_POST;
    	$login	= trim($post['login']);
    	$pw		= trim($post['pw']);
     
    	// Suite du code

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 222
    Points : 444
    Points
    444
    Par défaut
    Bonjour,

    Edit : Wait je viens de comprendre que j'avais pas compris
    Ton fichier : index.php
    Tu lui transmet un attribut page ( transmis de toute évidence en GET) page=home
    Ta 'page' tu dois la récupérer via $_GET et non $_POST
    Tu récupères le cookie 'code'

    Cdt
    Un problème sans solution est un problème mal posé. (Albert Einstein)

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 700
    Points : 857
    Points
    857
    Par défaut
    @gabi7756:
    Non, ce n'est pas non plus tout à fait ça.
    Ma page index est un routeur qui gère toutes les autres pages.
    Tout ce situe dans login.php et dans les conditions de contrôles. Tout va mal depuis l'introduction des cookies qui mémorisent les préférences de l'utilisateur.
    Pour une meilleure compréhension, je joins le code index:
    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
    <?php declare(strict_types=1);
     
    session_start();
     
    require_once "config.php";
    require_once "define.php";
    require_once "model/model.php";
    require_once "functions.php";
    require_once "language.php";
    require_once "view/lang/$language.php";
     
    $_SESSION['language'] = $language;
     
    use rawsrc\PhpEcho\PhpEcho;	// Moteur de rendu
     
    PhpEcho::setTemplateDirRoot(DIR_ROOT.'view');
    PhpEcho::setGlobalParam('language', $language);
    PhpEcho::setGlobalParam('h1', $textes['header_h1']);
     
    // Start application
    ####################
     
    $isIncluded = true;
     
    // for maintenance only
    /*
    foreach($_COOKIE as $key=>$cookie)
    	setcookie($key, $cookie, 0);
    */
     
    if( empty($_SESSION['user']) )
    	require_once('login.php');
     
    $page	= $_GET['page'] ?? $_SESSION['page'] ?? $_COOKIE['startPage'] ?? 'home';
    if($page !== 'editPerson')
    	unset($_SESSION['editPerson']);
     
    if( isset($_GET['idMain']) )
    	$_SESSION['idMain']	= $_GET['idMain'];
     
    if($page === 'home') {
    	$h1		= $textes['header_h1'];
    	$menu	= 'menu.php';
    }
    else {
    	$h1		= "Genealium";
    	$menu	= 'menuMain.php';
    }
     
    require_once VIEW_PAGE.$page.'.php';

  6. #6
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 395
    Points : 795
    Points
    795
    Par défaut
    Bonjour,

    1. Au premier chargement de index.php :
    -> ligne 31 $_SESSION['user'] est vide, donc login.php est chargé via require_once

    2. Au chargement de login.php :
    -> Dans le cas où l'utilisateur n'est pas enregistré et n'a pas saisi ses codes d'accès, la valeur false est affecté à $_SESSION['user'] (ligne 15 et 79)
    -> Puis une redirection est effectuée vers index.php?page=home

    3. Deuxième chargement de index.php :
    -> Puisque $_SESSION['user'] vaut false, la condition ligne 31 est fausse et la page login.php est alors rechargée -> retour au point 2 et boucle infinie

    Il semble donc y avoir un problème de conception dans ton code et à priori tu devais déjà avoir le même problème avec ton ancien code login.php dans le cas où $_SESSION['user'] est à false.
    D'ailleurs, dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // Errors handler
    if ( count($errors) )
    	$User = false;
     
    // Store info in session
    $_SESSION['errors'] = $errors;
    $_SESSION['user'] = $User;
    $_SESSION['demo'] = $User['id_abo'] === 1 ? true: false;
    -> Si $User est défini à false, alors $User['id_abo'] doit déclencher une erreur 'undefined index "id_abo"' lors de l'affectation de $_SESSION['demo'].


    Désactive les redirections pendant la phase de développement afin de déboguer plus facilement ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // header("Location: index.php?page={$page}");
    var_dump($_SESSION);
    echo "Redirection vers <a href='index.php?page={$page}'>index.php?page={$page}</a>";

    La vérification de l'authentification dans index.php ligne 31 ne devrait être faite que pour les pages qui nécessitent une authentification, actuellement elle semble systématique d'après ton code.
    Ton site devrait avoir au moins une page publique accessible sans authentification afin que l'utilisateur puisse se connecter (formulaire de connexion).

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 700
    Points : 857
    Points
    857
    Par défaut
    Tes remarques m'ont aidé. J'ai réécrit la page index et la page login. J'ai notamment déplacé le contrôle de cookies dans la page index ce qui est beaucoup plus logique puisque dans ce cas, je n'ai pas besoin de login.
    Je fais maintenant des tests de fonctionnement mais j'ai des soucis avec la page de déconnexion 'logout.php' qui n'efface pas les cookies:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php declare(strict_types=1);
     
    if( empty( session_id() ) )
    	session_start();
     
    $_SESSION = array_intersect_key($_SESSION, ['language'=>'', ]);
    foreach($_COOKIE as $key=>$cookie)
    	setcookie($key, $cookie, -1);
     
    header('Location: index.php');
    Voici la page index:
    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
    <?php declare(strict_types=1);
     
    session_start();
    var_dump($_COOKIE);	// Les cookies ne sont pas effacés.
     
    // for maintenance only
    /*
    foreach($_COOKIE as $key=>$cookie)
    	setcookie($key, $cookie, 0);
    */
     
    require_once "config.php";
    require_once "define.php";
    require_once "model/model.php";
    require_once "functions.php";
    require_once "language.php";
    require_once "view/lang/$language.php";
     
    $_SESSION['language'] = $language;
     
    use rawsrc\PhpEcho\PhpEcho;
     
    PhpEcho::setTemplateDirRoot(DIR_ROOT.'view');
    PhpEcho::setGlobalParam('language', $language);
    PhpEcho::setGlobalParam('h1', $textes['header_h1']);
     
    // Start application
    ####################
     
    $isIncluded = true;
     
    if( empty($_SESSION['user']) && !empty($_COOKIE['code']) ) {
    	$User	= getUser('id', $_COOKIE['code']);
    	$_SESSION['user']	= $User;
    	$_SESSION['page']	= $_COOKIE['startPage'] ?? 'family';
    	$_SESSION['demo']	= false;
    }
     
    // 'home' is default page reached without checking access
    $page = $_GET['page'] ?? $_SESSION['page'] ?? 'home';
     
    if($page !== 'editPerson')
    	unset($_SESSION['editPerson']);
     
    if( isset($_GET['idMain']) )
    	$_SESSION['idMain']	= $_GET['idMain'];
     
    if($page === 'home') {
    	$h1		= $textes['header_h1'];
    	$menu	= 'menu.php';
    }
    else {
    	$h1		= "Genealium";
    	$menu	= 'menuMain.php';
    }
     
    require_once VIEW_PAGE.$page.'.php';
    Je constate ligne 4 de la page index que les cookies ne sont pas effacés, ce qui empêche la déconnexion (ligne 32 de la page index).

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 222
    Points : 444
    Points
    444
    Par défaut
    Bonjour,

    Pour supprimer un cookie il faut utiliser unset :
    https://www.php.net/manual/fr/function.unset.php

    J'ai beau chercher je ne trouve pas de unset($_COOKIE['truc']) ...
    Tu auras pas oublié un extrait de code ou tout simplement oublié de supprimer le dit cookie ?

    Cdt
    Un problème sans solution est un problème mal posé. (Albert Einstein)

  9. #9
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 395
    Points : 795
    Points
    795
    Par défaut
    Essaye de renseigner une chaine vide pour la valeur du cookie à supprimer, et utiliser un temps d'expiration autre que -1 (time() - 3600 par exemple) :
    https://www.php.net/manual/fr/functi...p#example-4633

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 700
    Points : 857
    Points
    857
    Par défaut
    @gabi7756: unset() ne fonctionne pas pour les cookies. Pour effacer un cookie on le réécrit avec une date de validité négative. Sans vouloir m'avancer trop, c'est parce que le cookie est enregistré coté client alors que php s'exécute côté serveur. Voir à ce sujet l'exemple cité par Pytet et l'article de Pierre Giraud.

    @Pytet: C'est par étourderie que j'avais oublié le time(). Ceci dit ça marche aussi bien avec time() -1 qu'avec time()-3600. Merci. Je pense que c'est par sécurité qu'on met une valeur plus grande? Non?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/07/2020, 12h41
  2. Réponses: 14
    Dernier message: 03/02/2016, 15h19
  3. Réponses: 2
    Dernier message: 01/06/2010, 17h27
  4. Réponses: 0
    Dernier message: 02/06/2008, 14h30
  5. Je n'arrive pas à créer la base où je veux avec HCreation
    Par Cazaux-Moutou-Philippe dans le forum WinDev
    Réponses: 5
    Dernier message: 26/10/2006, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo