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 :

Identification Extranet : dois je utiliser les cookies ou les sessions ?


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut Identification Extranet : dois je utiliser les cookies ou les sessions ?
    Bonjour a tous,

    Voici des années que j'utilise un extranet fait maison avec une identification et sauvegarder par session.
    Depuis quelques temps deux de mes sites hébergés sur le même disque dur chez mon hébergeur (oxianet) offrent des comportements différents.
    Sur l'un, les sessions fonctionnent parfaitement et sur l'autre elles sautent de temps en temps .
    Sur le second cela a pour conséquence, la connexion a l'extranet réussie, mais des que l'on navigue, on est rejeté vers la page contenant le formulaire de connexion car la session de tien pas.

    Pour la partie commerciale de mon site, a savoir le panier, j'ai changé les sessions par des cookies, et tout est ok, par contre je ne sais pas si je peux faire la même chose pour un formulaire de connexion a un extranet, j'ai besoin de vos avis s'il vous plait.

    Pour info, je vous mets mes codes de connexion ci-dessous :

    index.php
    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
     
    <form class="form-login" method="post" name="login" action="'.$base_site.'">
                    <script src="cryptMD5.js" type="text/javascript"><!--mce:1--></script>
    		<div class="errorHandler alert alert-danger no-display"><i class="fa fa-remove-sign"></i> Il y a certaines erreurs, merci de les corriger</div>
    		<fieldset>
    			<div class="form-group">
    				<span class="input-icon">
    					<input type="text" class="form-control" id="username" name="username" placeholder="Pseudo">
    					<i class="fa fa-user"></i> 
                                    </span>
    			</div>
    			<div class="form-group form-actions">
    				<span class="input-icon">
    					<input type="password" class="form-control password" id="password" name="password" placeholder="Mot de passe">
    					<i class="fa fa-lock"></i>
    					<a class="forgot" href="?box=forgot">Mot de Passe oublié? </a> 
                                    </span>
    			</div>
    			<div class="form-actions">
    				<label for="remember" class="checkbox-inline"><input type="checkbox" class="grey remember" id="remember" name="remember">Conserver ma connexion</label>
    			        <input id="md5" name="md5" type="hidden" />
                                    <button type="submit" name="submit" class="btn btn-bricky pull-right">Connexion<i class="fa fa-arrow-circle-right"></i></button>
              		</div>
    		</fieldset>
                    <br><span style="font-size:11px" class="bold">Vous rencontrez des difficultés de connexion, merci de nous contacter au <b>'.$ent_tel.'</b></span>
    </form>
    session.php
    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
     
    <?php
    if (($_GET['action'] == 'logout'))
    	{
    		$utlog=$_GET['utlog'];
    		$date_compare = strtotime(date("Y-m-d"));
    		$date_con = strtotime(date("Y-m-d H:i:s"));
    		$res = mysql_query("SELECT * FROM `journal` where idUT='$utlog' and date='$date_compare' and connexion<>''");
    		$nbres=mysql_num_rows($res);
    		if ($nbres<>"0"){$modif=mysql_query("UPDATE journal SET `deconnexion` = '$date_con' where idUT='$utlog' and date='$date_compare' and connexion<>''");}
    		$_SESSION = array();
    		session_destroy();
    		header('Location: '.$base_site_err);
    	}
     
    if (($_GET['action'] <> 'logout'))
    	{
       		if (isset($_POST) && (!empty($_POST['username'])) && (!empty($_POST['password'])))
    		{
    	   		extract($_POST);
    		        $cmail = (isset($_POST['username'])) ? $_POST['username'] : '';
    			$cpass = (isset($_POST['password']))  ? $_POST['password']  : '';
    			$cpass=md5($cpass);
    	   	}
    	  	else 
    		{
             		$cmail = $_SESSION['username'];
    		        $cpass = $_SESSION['password'];
    	   	}
    		// CONNEXION	   
    		if ($cmail<>'')
                    {
    			$req = mysql_query("SELECT * FROM `utilisateur` where a_mail='$cmail' or a_pseudo='$cmail'");
    			$nbcon=mysql_num_rows($req);
    				if ($nbcon =="1") 
                                    { 
    					$data = mysql_fetch_assoc($req);
    					$idUT=$data['idUT'];
    					$passdata=$data['a_pass'];
    					 if ($cpass==$passdata and $data['a_acc']=="1") 
    					 {
    						if($data['a_pseudo']==""){$_SESSION['username'] = $data['a_mail'];}else {$_SESSION['username'] = $data['a_pseudo'];}
    						$_SESSION['password'] = $data['a_pass'];
    					        $mailOK = true; 
         					        $modif=mysql_query("UPDATE `utilisateur` SET `a_ip` = '$ip' where idUT='$idUT'");
    					        $MB_ip=$data['ip'];
    					        $modif=mysql_query("UPDATE `utilisateur` SET a_dateconx='".strtotime(date("Y-m-d H:i:s"))."' where idUT='$idUT'");
    					        $MB_mail=$data['a_mail'];
                                                    // recuperation des données de la personne
    					        $connexion="ok";
    				       }
    				       if ($cpass<>$passdata) {header('location: '.$base_site_err); }
    				       if ($data['acc']=='0') {header('location: '.$base_site_err.'?error=comptesupprime'); }
    				}
    				else {	header('location: '.$base_site_err); }
    		}
    		else {	header('location: '.$base_site_err); 	}
    }
    ?>
    et le début de chaque page qui récupère la session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    session_start();
    extract($_POST);
    include ('config.php');
    include ('session.php');
    header('Content-Type: text/html; charset=UTF-8');
    ?>

    Merci infiniment pour votre aide
    Olivier

  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
    Points : 44 155
    Points
    44 155
    Par défaut
    Un cookie est entièrement côté client ; il peut donc être falsifié, volé, créé à volonté et ne convient donc pas pour une authentification.
    De plus, tu ne vas pas tout modifier parce que tu n'arrivent pas à faire fonctionner les sessions.

    En parlant de sécurité, tu utilises la fonction extract() : cette pratique peut être source de trous de sécurités et de bugs dans un code.
    Egalement tu ne protéges pas tes requêtes des injections.

    En regardant seulement le début du code on voit des ré-écriture entreprendre :
    - pas besoin de boule parenthèses sur le if, par contre il est bon de verifier si les variables existent
    - ta requête UPDATE ne doit pas fonctionner car tu as un "date" qui se ballade tout nu (date est un mot reservé pour mysql)
    - les dates peuvent être mise directement dans la requête
    - il faut protéger la valeur venant de $_GET (je n'ai pas bien compris à quoi correspondait cette valeur d'ailleurs)
    - tu peux faire l'UPDATE sans avoir contrôle si la ligne existait, si elle n'existait pas il ne se passera rien c'est tout
    - utilise "else" plutôt que de réecrire le test à l'envers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (isset($_GET['action'], $_GET['utlog']) && $_GET['action'] == 'logout')
    	{
                    mysql_query("UPDATE journal SET `deconnexion` = NOW() where idUT='" . mysql_real_escape_string($_GET['utlog']) . "' AND `date` = CURDATE() and connexion<>''");
    		$_SESSION = array();
    		session_destroy();
    		header('Location: '.$base_site_err);
    	}
    else {
    Ca c'est du détail d'écriture (à part le "date" dans la requête), ça ne corrigera pas ton problème.
    Mais enlève tes extract() et fais un code plus propre, ça peut couvrir un bug.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Merci pour ces premiers éléments.

    J’avoue que mes connaissances se sont faites sur le tas depuis 15ans, par assimilation plus qu'en apprenant les bases.

    Donc beaucoup de mes codes ne sont pas très propres.

    En parlant de sécurité, tu utilises la fonction extract() : cette pratique peut être source de trous de sécurités et de bugs dans un code.
    J'utilise cette fonction pour récupérer les infos arrivant de formulaires divers, je ne vois pas comment faire autrement ??
    Egalement tu ne protéges pas tes requêtes des injections.
    J'avais vu des tutos pour comprendre les injections mais tout ce que j'ai testé ne fonctionnait pas du coup, je ne sais pas comment faire

    En regardant seulement le début du code on voit des ré-écriture entreprendre :
    C'est a dire ?

    - pas besoin de boule parenthèses sur le if, par contre il est bon de verifier si les variables existent
    Pourquoi les verifier puisque je sais qu'elles existes sinon les requetes ne fonctionneraient pas

    - ta requête UPDATE ne doit pas fonctionner car tu as un "date" qui se ballade tout nu (date est un mot reservé pour mysql)
    Je ne comprends pas ma requete fonctionne bien ... si je comprends bien je ne dois pas appeler un champ d'une BDD : 'date' ?

    - les dates peuvent être mise directement dans la requête
    Effectivement, ça simplifierait le code

    - il faut protéger la valeur venant de $_GET (je n'ai pas bien compris à quoi correspondait cette valeur d'ailleurs)
    Comment la proteger ? Cette valeur correspond a un appel de variable dans une url qui declenche la fonction

    - tu peux faire l'UPDATE sans avoir contrôle si la ligne existait, si elle n'existait pas il ne se passera rien c'est tout
    Je pensais ne pas encombrer l'execution des requete par une requete inutile si elle n'existe pas .

    Je vais tenter de simplifier mon code en appliquant un max de tes recommandations.

    Merci de ton aide

  4. #4
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour extract(), je pense que tu n'as pas compris le but de la fonction.
    Quand tu as un tableau $_POST['toto'], extract() va créer directement $toto = $_POST['toto'].
    Dans ton code tu utilises déjà $_POST, $_GET donc tes extract() ne sont même pas utiles.

    Pourquoi les verifier puisque je sais qu'elles existes sinon les requetes ne fonctionneraient pas
    C'est une valeur fournie par l'utilisateur donc tu ne peux pas être sûr.
    C'est quand même plus propre de faire le test que de laisser la requête se planter.

    Je ne comprends pas ma requete fonctionne bien ... si je comprends bien je ne dois pas appeler un champ d'une BDD : 'date' ?
    C'est bien ça, ou alors il faut l'encadrer `date`.
    Effectivement à cet emplacement dans cette requête ça ne semble pas géner mysql mais ailleurs tu aurais des problèmes.

    Comment la proteger ? Cette valeur correspond a un appel de variable dans une url qui declenche la fonction
    avec mysql_real_escape_string - cf. mon code
    au passage l'extension mysql est obsolète et remplacée par mysqli ou PDO.

    Je pensais ne pas encombrer l'execution des requete par une requete inutile si elle n'existe pas .
    Dans tous les cas, tu fais une requête au minimum, autant eviter d'en faire une deuxième.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Merci pour ces precieux conseils, je vais deja les appliquer et je reviendrai pour indiquer si en partie les eventuels bugs on été réparé ou si le pb vient d'ailleurs.

    Merci a toi et bonne nuit.

Discussions similaires

  1. Afficher les cookies, effacer les cookies?
    Par icekev dans le forum VB.NET
    Réponses: 1
    Dernier message: 29/03/2010, 10h05
  2. Réponses: 5
    Dernier message: 22/03/2006, 14h54
  3. [Cookies] lorsque les cookie sont désactiver
    Par Death83 dans le forum Langage
    Réponses: 5
    Dernier message: 16/03/2006, 21h02
  4. [Cookies] Détecter les cookies
    Par kot dans le forum Langage
    Réponses: 9
    Dernier message: 11/10/2005, 10h40

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