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 :

Sécurité avec les Sessions ?


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Points : 39
    Points
    39
    Par défaut Sécurité avec les Sessions ?
    Bonjour,
    tout d'abord je tiens à dire que je suis débutant en PHP. Cependant en un peu moins d'un mois (j'apprends le XHTML et CSS aussi, je peux pas trop tout faire en même temps!) j'arrive à pondre quelque chose de pondable (lol).
    J'ai un projet de site pour une association de taille moyenne. On est bien d'accord que le plus important est le contenu du site et la qualité des articles. Mais pour le "style" et parce-que je profite de l'occasion pour me former à PHP, j'aimerais créer un "espace membre" ou plutôt j'aimerais que les membres puissent se connecter (pseudo / passe) et qu'une fois connectés, certains liens leur soient visibles (par exemple celui du panneau d'administration pour un admin).
    je vais vous balancer les codes de mes 3 seules pages pour l'instant :
    Ca marche, j'ai pas de bug mais j'aimerais, si vous avez 5 minutes, que vous me dites si la syntaxe est bonne, si des expressions sont à oublier, et surtout si le fait de reconnaitre un user uniquement avec les variables de Session est bon (trou de sécurité, ça peut me poser pb pour la suite du dev ? ...) ou tout autre remarque sera la bienvenu
    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
    <?PHP
    	session_start();
    	require( 'inc/fonctions.inc.php' ); 
    ?>
    <!-- DocType etc. -->
    <head>
    <!-- ... -->
    </head>
     
    <body>
     
    <div id="en_tete">
    	<table id="a_la_une">
        	<tr>
            	<td><?PHP afficher_alaune(); ?></td>
    		</tr>
    	</table>
    </div>
     
    <div id="corps">
    	<div id="contenu">
    		<?PHP afficher_contenu( $_GET[ 'page' ] ); ?>
    	</div>
    	<div id="menu">
    		<div id="connexion"><?PHP include( "connexion.php" ); ?></div>
    		<ul class="rubriques_du_site">
    			<li class="lien"><a href="?page=accueil">Page d'accueil</a></li>
    		</ul>		
    		<ul class="rubriques_du_site">
    			<li class="rubrique">Rubrique 1</li>
    			<!-- Je zappe ça nous intéresse plus ... -->
    </body>
    </html>
    functions.inc.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
    <?PHP
    // -- JE RAPPELLE QUE TOUT LE SITE REPOSE SUR LA PAGE index.php (CHOIX PERSONNEL).
    // -- NE PAS OUBLIER QUE NOUS NOUS TROUVONS DANS index.php... EN EN-TETE.
     
    if( !(defined( 'CHEMIN_ALAUNE' )) ) { define( 'CHEMIN_ALAUNE' , '' ); }
    if( !(defined( 'CHEMIN_PAGES' )) ) { define( 'CHEMIN_PAGES' , '' ); }
     
    function afficher_alaune()
    {
    	$alaune = file( CHEMIN_ALAUNE . 'alaune.txt' );
    	echo( '<h2>' . $alaune[0] . '</h2>' );
    	echo( '<h3>' . $alaune[1] . '</h3>' );
    	echo( '<h1>' . $alaune[2] . '</h1>' );
    	fclose( $alaune );
    }
     
    function afficher_contenu( $page )
    {
    	//---Variables des pages---
    		$accueil = CHEMIN_PAGES . 'accueil.php';
    		$informations_sur_le_site = CHEMIN_PAGES . 'i_site.php';
    	//---Variables des pages---	
    	if( empty( $page ) ) 
    	{ 
    		$page = 'accueil'; 
    	}
     
    	if( empty( $$page ) ) 
    	{
    		// Nom de page incorrect !
    	}
    	else 
    	{
    		include( $$page );
    	}
    }
     
    function rafraichir() // Ecrit le script JavaScript qui va bien pour rafraichir une page...
    {
    	echo( '<script language="Javascript">' );
    	echo( 'window.location.reload();' );
    	echo( '</script>' );
    }
     
    ?>
    Et là très important :-)
    connexion.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
    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
    // -- JE RAPPELLE QUE TOUT LE SITE REPOSE SUR LA PAGE index.php (CHOIX PERSONNEL).
    // -- NE PAS OUBLIER QUE NOUS NOUS TROUVONS DANS index.php... DANS LE DIV "CONNEXION" LUI MEME SE TROUVANT DANS LE DIV "MENU"
     
    // DONC LA PAGE index.php SE (RE-)CHARGE :
    if( isset( $_SESSION[ 'pseudo' ] ) && isset( $_SESSION[ 'prenom' ] ) && isset ( $_SESSION[ 'droit' ] ) )
    // Les variables de session 'pseudo' ET 'prenom' ET 'droit' EXISTENT !
    {
    	echo( 'Bonjour ' . $_SESSION[ 'prenom' ] . ' !<br />' );
    	switch ( $_SESSION[ 'droit' ] ) // On pointe le "pouvoir".
    	{/* En construction...
    		case 0:
    			// Internaute
    			break;
    		case 1:
    			// ...
    			break;
    		case 2:
    			// ...
    			break; ...En construction */
    		case 3:
    			//	Administrateur
    			echo '<a href="admin/">Administration du site</a>';
    			break;
    	} // ===Fin du switch===
    }
    else
    // Les variables de session 'pseudo' ET 'prenom' ET 'droit' N'existent PAS !
    {
    	if( isset( $_POST[ 'valider' ] ) && !( empty( $_POST[ 'pseudo' ] ) || empty( $_POST[ 'passe' ] ) ) )
    	// Formulaire VALIDE ET ( les variables post 'pseudo' OU 'passe' NE sont PAS vides ).
    	{
    		$db = mysql_connect( 'localhost:8889', 'root', 'root' ); // Connexion à la base de données.
    		mysql_select_db( 'test', $db ); // Sélection de la base.
    		$sql = 'SELECT pseudo, prenom, passe, droit FROM utilisateurs WHERE pseudo = \'' . $_POST[ 'pseudo' ] . '\''; // Création de la requête.
    		$req = mysql_query( $sql ); // Requête :-)
    		if( mysql_num_rows( $req ) > 0 ) 
    		// Le nombre de lignes (nombre d'enregistrements du coup) correspondant à la requête est SUPERIEUR à 0.
    		// En clair il y a au moins 1 enregistrement (1 seul possible normalement...).
    		{
    			$passe = md5( $_POST[ 'passe' ] );
    			$data = mysql_fetch_assoc( $req );
    			if( $passe == $data[ 'passe' ] )
    			// Mot de passe CORRECT !
    			{
    				$_SESSION[ 'pseudo' ] = $data[ 'pseudo' ];
    				$_SESSION[ 'prenom' ] = $data[ 'prenom' ];
    				$_SESSION[ 'droit' ] = $data[ 'droit' ];
    				rafraichir();
    			}
    			else
    			// Mot de passe INCORRECT !
    			{
    				$_SESSION[ 'message_echec' ] = 'mot de passe incorrect !';
    				rafraichir();
    			}
    		}
    		else
    		// Le nombre de lignes correspondant à la requête N'est PAS SUPERIEUR à 0. (pas d'enregistrement...)
    		{
    			$_SESSION[ 'message_echec' ] = 'le pseudo ' . $_POST[ 'pseudo' ] . ' n\'existe pas !';
    			rafraichir();
    		}
    		mysql_close( $db );	
    	}
    	else
    	{
    		// Affichage du formulaire de connexion.
    		if( isset( $_SESSION[ 'message_echec' ] ) )
    		{
    			echo '<em>' . $_SESSION[ 'message_echec' ] . '</em>';
    		}
    		else
    		{
    			echo '<strong>Identifiez-vous !</strong>';
    		}
    		echo '<form method="post" action="">';
    		echo 'Nom d\'utilisateur <input type="text" name="pseudo" /> ';
        	echo '<br />Mot de passe <input type="password" name="passe" /> ';
        	echo '<input type="submit" name="valider" value="Connexion" />';
    		echo '</form>';
    	}
    }
     
    ?>

  2. #2
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    La syntaxe est bonne, sinon ça ne marcherait pas

    Reconnaître un utilisateur grâce à une variable de session est une méthode classique, ça ne pose pas de problème en soi. Si faille de sécurité il y a, ce sera ailleurs (champs de formulaire non contrôlés, injection SQL, vol de session).

    Par exemple :
    où $page est une variable récupérée dans $_GET, donc qui peut être manipulée à loisir par n'importe quel pirate.


    Quelques piste de réflexion en faisant une lecture du code à la volée :

    - s'attaquer à ce projet après un mois de formation, si j'ai bien compris, prouve une belle capacité d'adaptation. Bravo donc !

    - MAIS si écrire du PHP/XHTML/JS/CSS selon les règles de la syntaxe est un excellent début, il faut aussi, pour écrire du code robuste (maintenable/évolutif/lisible) respecter quelques règles de design.

    En particulier, pour ce qui nous intéresse ici, découpler tout ce qui est de l'ordre de la présentation (code HTML et comment on le construit) de tout ce qui est de l'ordre des traitements. Ton code mélange ces aspects. Ca ne l'empêchera pas de fonctionner mais le risque est (très) élevé que cela tende rapidement vers le modèle de conception connu sous le nom de Big Ball of Mud. Pour un site web, la référence classique serait plutot le modèle MVC ou ses variantes.

    Ici, ce qui est de l'ordre du traitement et qui devrait se trouver isolé dans un fichier ou, mieux, dans des classes dédiées, c'est : repérage de l'utilisateur, renseignement des variables de session, requêtes SQL de connexion. Aucune de ces fonctions ne devrait faire d'echo mais certaines peuvent éventuellement renvoyer des chaînes qui seront exploitées par un echo pour construire la vue.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    merci beaucoup Herode pour ta réponse !
    en fait je ne débute pas dans le monde de la programmation je connaissais déjà Visual Basic 6 (pas terrible mais c'est déjà ça ). donc j'ai pas trop de soucis avec les notions de base (variables, fonctions, if...else..., etc.).
    mais je débute dans le developpement pour le web. (et encore un peu de hors sujet, les classes c'est aussi nouveau pour mon petit cerveau !)


    j'ai bien compris tes recommandations, en repensant la structure du site c'est même beaucoup plus logique et clair.
    faudrait-il par exemple, en suivant mon idée d'avoir une seule page qui affiche au milieu ce qu'il faut façon ""blog"", commencer mon index
    -en "requirant" une page regroupant les fonctions "pointant" l'utilisateur, qui me returneront le pseudo, les "droits" etc.
    -suivie d'une page qui génère ce qu'il me faut pour l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $div_connexion = '<div id="connexion">'
    if( utilisateur_connecte() ) {
        $div_connexion .= 'Bonjour cher membre';
    }
    else {
        $div_connexion .= 'Identifiez-vous !'
        // ............
    }
    $div_connexion .= '</div>
    // ainsi de suite
    et donc j'aurais plus que du code html avec quand il faut des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p>Blablabla</p><? echo( $div_connexion ); ?><hr/><p>Et lalalilalala</p>
    voili voilou et au passage je me pose une question :
    comment une fonction peut-elle retourner TRUE ou FALSE en php ?
    return( true ); c'est correct ?

  4. #4
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    return true;

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    thanks

  6. #6
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Citation Envoyé par niavlys26 Voir le message
    faudrait-il par exemple, en suivant mon idée d'avoir une seule page qui affiche au milieu ce qu'il faut façon ""blog"", commencer mon index
    -en "requirant" une page regroupant les fonctions "pointant" l'utilisateur, qui me returneront le pseudo, les "droits" etc.
    -suivie d'une page qui génère ce qu'il me faut pour l'affichage
    Par exemple. Tu as compris le principe

  7. #7
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par niavlys26 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $div_connexion = '<div id="connexion">'
    if( utilisateur_connecte() ) {
        $div_connexion .= 'Bonjour cher membre';
    }
    else {
        $div_connexion .= 'Identifiez-vous !'
        // ............
    }
    $div_connexion .= '</div>
    // ainsi de suite
    Ben, pour affiner le principe, disons que
    en fait la partie "<div id="connexion">"
    est plutot dans la partie "vue" alors que "Bonjour.."/"Identifiez.." est plus dynamique donc dans le controleur.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    Yes, j'ai consulté quelques tutos à ce sujet et je pense avoir saisi les bases de ce modèle. D'ailleurs je n'avais pas balayé l'ensemble des tutos avant de poster et j'en suis désolé, car ils sont très bien rédigés !

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

Discussions similaires

  1. Faille de sécurité avec les sessions ?
    Par goku19 dans le forum Langage
    Réponses: 8
    Dernier message: 19/03/2015, 14h00
  2. Réponses: 9
    Dernier message: 04/07/2008, 11h53
  3. Problèmes avec les Sessions
    Par alexthomas dans le forum Langage
    Réponses: 5
    Dernier message: 20/11/2005, 21h53
  4. [Sécurité] securite avec les sessions.
    Par krapoulos dans le forum Langage
    Réponses: 7
    Dernier message: 05/11/2005, 14h41
  5. Problème avec les sessions
    Par philippef dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2005, 15h19

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