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

PHP & Base de données Discussion :

authentification pour back office [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut authentification pour back office
    Bonjour, j'essaie de faire un système d'authentification pour un backoffice (jamais fait).

    Et j'ai du mal à saisir le principe des variables $_SESSION, j'ai regardé sur le site php manual,

    ce sont des variables qui tout le long de la session gardent en mémoire le login et mot de passe?

    Et est ce qu'il faut la détruire à la fin, car dans mon code, quoique je fasse il se connecte, même si c'est pas les bons codes.

    Et sur php manual ils disent :

    N'utilisez PAS la fonction unset() avec $_SESSION sous la forme unset($_SESSION) sinon, cela rendra impossible l'enregistrement de données dans la session en utilisant la super-globale $_SESSION.
    Voici mon code

    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
    <div id="content_identification">
     
    	<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
     
    		<div id="titre">Veuillez vous identifier</div>
     
    		<div id="authentification">
    			<span id="champs">Nom d'utilisateur : </span><span id="input"><input type="text" name="login"></span><br/><br/>
    			<span id="champs">Mot de passe : </span><span id="input"><input type="password" name="mdpass"></span><br/><br/>
    			<span id="input"><input type="submit" value="valider"></span>
    		</div>
     
    	</form>
     
    </div>
     
    <?php
    	if (isset($_POST['login'])){		
     
    		$u="SELECT * FROM $backoffice.users WHERE login = '".$_POST['login']."' AND passe = '".$_POST['mdpass']."' ;";
    		$sql = mysql_query($u);
    		//echo mysql_num_rows($sql);
    		if (mysql_num_rows($sql)==1){
    			$m = mysql_fetch_array($sql);
    			$_SESSION["user"] = $m['users'];
    			$_SESSION["nomprenom"] = $m["prenom"]." ".$m["nom"];
    		} 
     
    		if (isset($_SESSION["user"])){
    			$url = "index2.php";
    		}else {
    				$url="index.php?errlogin=true";
    		}
    		echo '<script> document.location="'.$url.'";</script>';
    	}
    ?>
    Les utilisateurs et noms de code sont présents dans la bdd.

    Pourquoi lorsque je teste mysql_num_rows($sql); (mis en commentaire dans le code), j'ai bien 0 lorsque je rentre n'importe quoi mais j'accède quand même à la page index2.php?
    Merci.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ta vérification doit être faite sur la page protégée ; sinon il suffit de saisir directement la page index2.php pour y accèder.

    Il faut également protéger tes valeurs $_POST avec mysql_real_escape_string().

    Les variables en sessions n'ont pas besoin d'etre supprimées : la session est détruite à la fermeture du navigateur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    Merci pour ta réponse,

    en fait je dois tester la chose plutôt comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (isset($_SESSION["user"])){
    	$url = "index.php?errlogin=true";
    }else {
    		$url="index.php?login=false";
    }
    En restant sur la même page au lieu de mettre un index2.php?

    Sur facebook, bon je sais c'est pas top l'exemple, mais quand on se connecte, on passe de login.php à home.php. Donc 2 pages différentes.

  4. #4
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    Autre question, lorsqu'on est authentifié, on est amené à changer de pages, ces pages on pourrait y accéder sans s'être authentifié si on connait l'url, faut il faire le test à chaque fois? Comment fait on pour que l'authentification soit enregistrée?

    Et pourquoi ici, je ne vois pas la variable $_SESSION, dois je utiliser ces fonctions?

    http://a-pellegrini.developpez.com/t...b/?page=page_4

    C'est encore moi

    Est ce que ça c'est bon?

    Ma page index.php initiale avec le formulaire de saisie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <form action="index2.php" method="post">
     
    	<div id="titre">Veuillez vous identifier</div>
     
    	<div id="authentification">
    		<span id="champs">Nom d'utilisateur : </span><span id="input"><input type="text" name="login"></span><br/><br/>
    		<span id="champs">Mot de passe : </span><span id="input"><input type="password" name="mdpass"></span><br/><br/>
    		<span id="input"><input type="submit" value="valider"></span>
    	</div>
     
    </form>
    Et la page sur laquelle le formulaire renvoie :

    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
    <?php
    session_start();
    
    include "connexion_admin/connect.php";
    
    
    if (isset($_POST['login'])){ // execution apres envoi du formulaire
    	
    	
    	$u="SELECT * FROM $portail.users WHERE login = '".$_POST['login']."' AND passe = '".$_POST['mdpass']."' ;";
    	$sql = mysql_query($u);
    
    	if (mysql_num_rows($sql)==1){
    		$m = mysql_fetch_array($sql);
    
    		$_SESSION["user"] = $m['users'];
    		$_SESSION["nomprenom"] = $m["prenom"]." ".$m["nom"];
    		$url = "index2.php?test=oui";
    	} 
    	else{
    			echo '<script>alert(\'Erreur !\');</script>';
    			$url="index2.php";
    	}
    							echo '<script> document.location="'.$url.'";</script>';
    
    }
    
    ?>
    Ce que j'ai mis en rouge, c'est pour la question, entre parenthèses, ça marche, si je tape de mauvais identifiants, je suis dans la bonne boucle et vice versa.

    Maintenant, qu'on est identifié, déjà j'imagine que question sécurité ça doit être bourré de failles puisque je débute en la matière, comment je peux l'améliorer?

    J'ai noté le mysql_real_escape_string() déjà.

    Pour le reste, je veux proposer les fonctions d'administrations dans une autre page (la ligne que j'ai mise en rouge, je voudrais mettre un autre fichier php), est ce que pour vérifier l'authentification, je dois à chaque fichier vérifier les variable de session avec isset?

    Merci.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    J'ai noté le mysql_real_escape_string() déjà
    C'est bien de le noter, il faut le faire maintenant.

    faut il faire le test à chaque fois?
    oui au début de chaque page concernée, tu dois vérifier si tu as affaire à un utilisateur enregistré ou non.
    Comment fait on pour que l'authentification soit enregistrée?
    Tu n'es pas obligé de controler a chaque fois le login/pass de l'utilisateur, il faut juste controlé que tu as bien validé cela dans une session.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    ok, après m'être attaqué par injection sql, je comprends mieux

    j'ai donc rectifié comme ceci, ça a l'air de bien marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql=sprintf("SELECT * FROM $portail.users WHERE login = '%s' AND passe = '%s';",
    mysql_real_escape_string($_POST['login']),
    mysql_real_escape_string($_POST['mdpass']));
    Est ce que niveau sécurité ça suffit? C'est pour savoir si niveau sécurité standard, c'est le seul truc à faire.

    Et donc maintenant, (je remets l'intégralité du code concerné)

    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
     
    if (isset($_POST['login']) && isset($_POST['mdpass'])){ // execution apres envoi du formulaire
     
    	$sql=sprintf("SELECT * FROM $portail.users WHERE login = '%s' AND passe = '%s';",
     
    		mysql_real_escape_string($_POST['login']),
    		mysql_real_escape_string($_POST['mdpass']));
     
    	$req = mysql_query($sql);
     
    	if (mysql_num_rows($req)==1){
    		$enr = mysql_fetch_array($req);
     
    		$_SESSION["user"] = $enr['users'];
    		$_SESSION["nomprenom"] = $enr["prenom"]." ".$enr["nom"];
    		$url = "admin.php?"; // on envoie sur la page d'accueil de l'administration 
    	} 
    	else{
    			echo '<script>alert(\'Erreur !\');</script>';
    			$url="index.php"; // on renvoie sur la page d'identification
    	}
    							echo '<script> document.location="'.$url.'";</script>';
     
    }
    Donc j'ai mis en commentaire ce que je compte faire, si l'authentification est bonne, j'arrive sur la page d'administration admin.php, dans laquelle je compte tester (reprenez moi si je me trompe) :

    $_SESSION["user"]
    $_SESSION["nomprenom"]

    Et comment dois je les tester? Un isset suffit-il?

    Merci !

  7. #7
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    J'ai un code qui se rapproche à celui ci (je l'ai réduit à l'essentiel), peut être que ceci pourrait t'inspirer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Redirection vers login.php SI le user n'est pas identifié.
    if (!isset($_SESSION['user']) && basename($_SERVER['PHP_SELF']) != 'login.php') {
    	header('HTTP/1.1 303 See Other');
    	header('Location: login.php');
    }
    En résumé :
    Si la page demandée est login.php, la page sera proposée (que le user soit identifié ou pas).
    Si le user n'est pas identifié, il sera redirigé vers login.php

    Après, faut voir ton besoin, et comment ton site (tes pages plus particulièrement) est organisé.
    Mais en résumé, ce code devrait être exécuté dans toutes les pages ou une identification est nécessaire.
    Si c'est une partie admin, alors ça devrait concerner toutes les pages (sauf le login.php).


    Pour le coté pratique, il serait pas mal de créer un tableau de la session à 2 dimensions, avec les infos propre au user.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $_SESSION['user']['user'] = $enr['users'];
    $_SESSION['user']['name'] = $enr["prenom"]." ".$enr["nom"];
    $url = "admin.php?"; // on envoie sur la page d'accueil de l'administration
    (utiliser un nom comme user_id dans la Bdd n'aurait pas été si mal non plus).

    A mon sens, il serait bon de faire une redirection vers une autre page lorsque l'identification a réussi.
    Ceci aura l'avantage de purger les données reçues en POST.
    Comme ceci peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $_SESSION['user']['user'] = $enr['users'];
    $_SESSION['user']['name'] = $enr["prenom"]." ".$enr["nom"];
    header('HTTP/1.1 303 See Other');
    header('Location: admin.php');
    En faite, il vaut mieux éviter les redirections en JS, c'est pas géantissime (c'est de la vieille école, si on peu dire).


    Il faudra bien prendre soin que cette variable de session du nom de "user" soit crée uniquement lorsque l'identification est réussie, tout repose le dessus.

  8. #8
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    Merci c'est gentil, je vais voir pour enlever le javascipt et le remplacer par du php pour les redirections et c'est vrai que c'est mieux d'avoir toute les informations relatives à une session sur un tableau à 2 dimensions.

    Je pense avoir saisi le fonctionnement des variables "session", je trouve à titre personnel que c'est de la sécurisation assez simple. Je n'ai pas trop de notions de hacking, mais je me demande pour le sites sécurisés, qui vu le comportement identique, doivent également utiliser des variables $_session. Finalement ce qui fait leur différence, si c'est juste un cryptage élevé des identifiants de connexion, de compte etc... ou si au niveau des variables de session, il y a de la sécurité supplémentaire également.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Par défaut
    bonjour,
    le principe pour les sessions:
    1/ on vérifie sur la bdd que le couple login/password existe.
    2/s'il existe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // On compte le nombre de résultats, si c'est ok, il est de 1, sinon de 0 
    $num = @ mysql_num_rows ( $req ); 
    if ( $num <> 0 ) { // Si il y a 0 résultats, on affiche un message d'erreur et on revoie le visiteur d'où il vient ! 
    session_start (); // On d&eacute;marre une session 
    $user = @ mysql_fetch_array ( $req ); // On ressort la requête dans un tableau 
    session_register ( "user" ); // On enregistre la session
    header("location:admin.php"); // et on redirige sur la bonne page
    }else{
    header("location:form_ident.php");}
    et dans chaque page on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <? 
    session_start (); // On initialise une session 
    if(! session_is_registered ( "user" ))
    { 
    header("location:index.php"); // si pas de session on redirige sur accueil
    }
    else{
    header("location:admin.php"); // si session on redirige sur l'admin
    }

  10. #10
    Membre éclairé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2008
    Messages : 557
    Par défaut
    Merci notar,

    sur php manual, j'ai lu qu'ils recommandent vivement de ne plus utiliser session_register() depuis php 5.3

    http://fr.php.net/manual/fr/function...n-register.php

    c'est pour ça que je ne l'ai pas utilisé.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Par défaut
    oui, exact.
    mais bon, les serveurs mutualisés, online, amen, ...etc ne sont pas encore passé en Php5 ....alors!

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

Discussions similaires

  1. [AJAX] [Xajax] Framework ajax pour "petit" back office
    Par mohican13 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 06/05/2008, 17h39
  2. pour la gestion du back office
    Par sayes1 dans le forum E-Commerce
    Réponses: 0
    Dernier message: 30/01/2008, 13h37
  3. Réponses: 2
    Dernier message: 04/05/2007, 14h10

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