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 :

Précisions sur le tutoriel "sécuriser vos sessions avec une base de données"


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut Précisions sur le tutoriel "sécuriser vos sessions avec une base de données"
    Salut a tous
    Je viens de me plonger dans ce tutoriel
    [url]http://a-pellegrini.developpez.com/tutoriels/php/session-db/[url]
    Mais j'ai quelques soucis.
    Tout d'abord je me fais je ne vois pas bien à quoi correspond PREFIX_DB_SITE dans la fonction ci dessous.
    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
     
    function openSession($userid) {
    	global $db;
     
    	// On supprime la session en cours
    	$deleteSQL = $db->prepare('DELETE FROM '.PREFIX_DB_SITE.'session WHERE userid = :userid');
    	$deleteSQL->execute(array(':userid' => $userid));
     
    	// Re-génération du sid
    	session_regenerate_id();
     
    	// On insère le nouvel id de session dans la db
    	$insertSQL = $db->prepare('INSERT INTO '.PREFIX_DB_SITE.'session (sid, userid)
    				     VALUES (:sid, :userid)');
    	$insertSQL->execute(array(':sid' => session_id(),
    				  ':userid' => $userid,
    				  ':ip' => getIP(),
    				  ':browser' => getBrowser(),
    	));
     
    	return TRUE;
    }
    D'autre part j'ai cette erreur Fatal error: Call to a member function prepare() on a non-object

    Doit on définir quelque part ce qu'est la variable $db ?

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    D'autre part j'ai cette erreur Fatal error: Call to a member function prepare() on a non-object

    Doit on définir quelque part ce qu'est la variable $db ?
    Tout à fait, dans le script appelant car la variable est déclarée avec global.

    http://fr.php.net/manual/fr/language...bles.scope.php

  3. #3
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    D'accord je vois. Par contre ce que je ne vois pas c'est qu'est ce que c'est comme type de variable $db. Manifestement c'est une class donc j'ai été fouillé dans la doc de PHP un peu pour savoir de quoi il retournait.
    J'ai trouvé une classe mysqli qui devrait convenir puisque j'utilise une base mySQL.
    Je vais tester ça demain

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Visiblement, $db est un objet PDO, mais c'est vrai que cela manque un peu de précisions dans le tuto.

    Tu peux aller voir là : http://fr.php.net/manual/fr/book.pdo.php

  5. #5
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Il y a un autre problème qui est que je dois me connecter à la base pour accéder à la table des utilisateurs. Pour celà je dois mettre en clair dans mon script l'identifiant et le mot de passe pour la connexion. N'y a t'il pas là un problème de sécurité?

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Il faut bien que tu indiques à ton script php comment se connecter à ta base de données.

    Ce n'est pas en soit une faille de sécurité. Ce qui peut l'être, par contre, c'est un mauvais paramétrage du serveur web qui permettrait par exemple de récupérer un script php non interprété, ou encore une faille d'un script d'upload permettant à un utilisateur de charger sur le serveur du code exécutable (par exemple un script php).

    Il existe des moyens de limiter certaines possibilités, par exemple en mettant ces informations dans un fichier de configuration non accessible à travers le serveur web (par le protocole http), mais il n'existe pas de solution 100% sûre.

  7. #7
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    En utilisant la classe PDO ça fonctionne mieux.
    Par contre j'ai un souci au niveau de la vérification du l'identité et du mot de passe de l'utilisateur.
    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
     
    function getLoginCheck($username, $password) { 
    	global $db;
     
    	$username = addslashes(trim($username));
    	$password = md5(addslashes(trim($password)));
    	echo('ID='.$username.' Pass='.$password.'<br>');
    	// Petite vérification pour éviter une requête sql
    	if (empty($username) && empty($password)) {
    		return FALSE;
    	} else {
    		$sql = $db->prepare('SELECT id FROM '.PREFIX_DB_SITE.'user
    				      WHERE username = :username
    				      AND password = :password ');
     
    		$sql->execute(array(':username' => $username,
    				    ':password' => $password,
    		));
     
    		$userdata = $sql->fetch(PDO::FETCH_ASSOC);
     
    		if (!empty($userdata)) {
    			$userdata = $userdata['id'];
    		} else {
    			$userdata = FALSE;
    		}
     
    		return $userdata;
    	}
    }
    Cette fonction $password = md5(addslashes(trim($password)));me transforme le mot de passe en un charabia sans doute destiné à ce qu'on ne puisse pa lire le mot de passe. Ce qui est très bien mais en attendant comme je n'ai pas la même chose dans ma base de donnée ça pose problème.
    Y a t'il une fonction particulière à exécuter au niveau de la base quand j'enregistre les utilisateurs?

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Oui : la même (md5)

    Tu enregistres tes utilisateurs avec une page php, ou avec une interface comme phpMyAdmin ?

  9. #9
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Pas la peine de répondre j'ai trouvé tout seul comme un grand. Il faut que j'utilise la fonction MD5 lorsque je saisie le mot de passe dans ma base de donnée. Comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE `mabase`.`site_user` SET `last_modified` = NOW( ) ,
    `password` = MD5( 'Admin' ) WHERE `site_user`.`id` =2 LIMIT 1 ;

  10. #10
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Par contre je ne comprend pas comment par la suite on ne peut pas accéder à une page du site quelconque avec ce code au début de chaque page.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    if (!$userdata = getUserInfo()) {
    	$userdata = array();
    }
     
    if (!empty($userdata['username'])) {
    	echo 'Bonjour '.$userdata['username'];
    } else {
    	echo 'Bonjour Anonyme';
    }

  11. #11
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Cette fonction récupère les informations de l'utilisateur si une session est définie en fonction de l'id. S'il n'y a pas de session alors tu redirige vers le formulaire..

    Pour ton mot de passe, tu peux utiliser un salt md5 en lieu et place du simple md5

    Je travaille comme toi avec ce tuto et je bloque avec la fonction openSession()

    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
     
    function openSession($userid) {
    	global $db;
     
    	// On supprime la session en cours
    	$deleteSQL = $db->prepare('DELETE FROM '.PREFIX_DB_SITE.'session 
    					WHERE userid = :userid');
    	$deleteSQL->execute(array(':userid' => $userid));
     
    	// Re-génération du sid
    	session_regenerate_id();
     
    	// On insère le nouvel id de session dans la db
    	$insertSQL = $db->prepare('INSERT INTO '.PREFIX_DB_SITE.'session (sid, userid, ip, browser)
    				     VALUES (:sid, :userid, :ip, :browser)');
    	$insertSQL->execute(array(':sid' => session_id(),
    				  ':userid' => $userid,
    				  ':ip' => getIP(),
    				  ':browser' => getBrowser(),
    	));
     
    	return TRUE;
    }
    Cette fonction doit ouvrir la session.. je devrais donc avoir session_start(); au lieu de session_regenerate_id(); , non ?

  12. #12
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Pour session_start() c'est pas forcément obligatoire car il est possible de configurer le php avec session.auto_start=1. Ce qui évite d'avoir à mettre des session_start() un peu partout.

  13. #13
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Effectivement mais je préfère tout de même ça que d'impacter tous les sites de mon serveur

  14. #14
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    Si mes souvenirs sont bon, j'avais placé le session_start() au début de chacune de mes pages ensuite j'ai configuré le PHP en session auto start

  15. #15
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    J'ai une autre question, comment as tu réglé le problème de connexion à la base de donnée pour cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ($userdata = getUserinfo()) {
    	openSession($userdata['id']);
    	getMsg($userdata['username']);
    } else {
    	if (!$_POST) {
    La fonction getUserinfo() va chercher les informations dans la base mais je n'ai pas de connexion ouverte

    Le début de mon fichier index.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    session_start();
     
    require_once ("./config.php");
    require_once ("./includes/database.php");
    require_once ("./includes/authentification.php");
     
    if ($user_informations = getUserInfo()) {
    Comment as tu réglé ce problème Gouyon ?

  16. #16
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 084
    Points : 1 525
    Points
    1 525
    Billets dans le blog
    5
    Par défaut
    J'ai tout simplement ouvert la connexion avec un user et un password définit dans la base (avec phpMyAdmin par exemple)

    Ca m'a posé un problème parce que c'est écrit en dur dans mon code php. Mais a ce qui parait ce n'est pas un problème puisque le code php n'est pas visible (sauf si le serveur est configuré pour que le code php soit visible)

  17. #17
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    J'ai bien compris ce point mais il y a quelque chose qui cloche..

    On commence par vérifier si nous avons des informations sur l'utilisateur avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ($userdata = getUserinfo()) {
    	openSession($userdata['id']);
    	getMsg($userdata['username']);
    }
    qui lui même appelle cette fonction :

    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
     
    function getUserInfo() { 
    	global $db;
     
    	$sql = $db->prepare('SELECT u.id, u.active, u.date, u.last_modified, u.username, u.country, 
    					 u.gender, u.birthday, u.avatar
    				FROM site_session s
    				INNER JOIN site_user u
    					ON s.sid = :sid
    					AND s.userid = u.id ');
     
    	$sql->execute( array(':sid' => session_id()) );
     
    	$userdata = $sql->fetch(PDO::FETCH_ASSOC);
     
    	if (empty($userdata)) {
    		$userdata = FALSE;
    	}
     
    	return $userdata;
    }
    En gros ma question, comment récupère t-on "global $db;" alors qu'aucune connexion n'est ouverte.. Une solution serai d'ouvrir la connexion avant la vérification mais cela signifie qu'a chaque fois qu'une personne vient sur ma page index.php sans forcement vouloir se connecter ouvrira une connexion..

    Est ce une bonne pratique ?

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    oui. C'est la pratique habituelle en php. Les connexions persistantes sont possibles mais pas vraiment recommandées. Enfin c'est quelque chose d'assez particulier à étudier un petit peu.

    Quand global $db, il faut le déclarer avant, mais tu peux tout aussi bien passer par un singleton via quelques modifications. Singleton qui te permettra à loisir de faire un peu de lazy loading.

  19. #19
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par kaymak Voir le message
    oui. C'est la pratique habituelle en php. Les connexions persistantes sont possibles mais pas vraiment recommandées. Enfin c'est quelque chose d'assez particulier à étudier un petit peu.

    Quand global $db, il faut le déclarer avant, mais tu peux tout aussi bien passer par un singleton via quelques modifications. Singleton qui te permettra à loisir de faire un peu de lazy loading.
    Alors là je suis noyer.. je vais chercher "Singleton" et "lazy loading"

  20. #20
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Points : 87
    Points
    87
    Par défaut
    Ok mais si on ne code pas en POO, peut on contourner ce problème ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/04/2012, 12h42
  2. Réponses: 3
    Dernier message: 26/01/2011, 12h21
  3. Réponses: 7
    Dernier message: 17/03/2008, 15h48
  4. Stocker les sessions dans une base de données
    Par mic79 dans le forum Langage
    Réponses: 7
    Dernier message: 06/04/2006, 21h57
  5. communiquer avec une base de données sur internet
    Par richard038 dans le forum Bases de données
    Réponses: 7
    Dernier message: 15/02/2006, 18h01

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