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é] identification php basée sur des sessions "sécurisées"


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [Sécurité] identification php basée sur des sessions "sécurisées"
    salut,

    j'essaye d'ecrire un script php pour elaborer un système d'identification,

    le principe est le suivant :

    on lie la session a l'adresse ip de l'agent utilisateur
    on genere aléatoirement le nom de la session.
    le nom de la session est une chaine numérique, cela force php a regenerer l'id de session a chaque fois.

    je voudrais profiter de l'experience de developpers avancés afin de corriger et d'améliorer ce script, je suis ouvert a toutes les remaques et suggestions.

    merci d'avance de votre aide


    voici le script

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    <?
    /*
    	module de d'identification  
    */
     
     
     
    // on commence par tester si l'agent utilisateur a deja une session valide
    // si la session n'est pas enregistrée ou n'est pas valide
    if ( !session_is_registered('sremoteadr') or session_my_test() != true ) {
     
     
    	$part = 'login'; // appelera le formulaire de login
     
    // si la session est valide
    } elseif ( session_is_registered('sremoteadr') and session_my_test() == true and session_is_registered('alevel') ) {
     
    	// on test si l'agent utilisateur a les droits nécessaires
    	@session_start();
     
    	if ( $_SESSION['alevel']['a'] != 'on' ) {
     
    	$part = 'login'; // appelera le formulaire de login
     
    	} elseif ( $_SESSION['alevel']['a'] == 'on' ) {
     
     
    	$part = 'pass';
     
    	}
     
     
    }
     
     
    // si des données on été postées
    if ( isset($_POST['login']) and isset($_POST['pass']) ) {
     
    	trim($_POST['login']);
    	trim($_POST['pass']);
     
    // on test si les login et mot de passe on la forme recquise
    	if ( empty($_POST['login']) or empty($_POST['pass']) or strlen($_POST['login']) != 8 or strlen($_POST['login']) != 8
    			or preg_match('#[^a-z0-9]#i',$_POST['login']) or preg_match('#[^a-z0-9]#i',$_POST['pass'])
    	 ) {
     
    			$part = 'relogin'; // echec de l'identification
     
    	// si les données d'itentification ont la forme attendue
    	} elseif ( !empty($_POST['login']) and !empty($_POST['pass']) and strlen($_POST['login']) == 8 and strlen($_POST['login']) == 8
    						and !preg_match('#[^a-z0-9]#i',$_POST['login']) and !preg_match('#[^a-z0-9]#i',$_POST['pass'])
    	 ) {
     
    	 		// on test l'existance des login mot de passe dans la base de donnée
    	 		include("func/_Conadm.php");
     
    	 		$prob = mysql_query('SELECT admin_alevel, admin_pseudo FROM s_admin WHERE admin_login=\''. mysql_real_escape_string($_POST['login']).'\' AND admin_pass=\''.mysql_real_escape_string($_POST['pass']). '\'',$conadm); 
     
    			if ( $prob == true and mysql_num_rows($prob) == 1 ) {
     
    					$data = mysql_fetch_assoc($prob);
    					mysql_close($conadm); // on ferme la connexion a la base	
     
    					session_my_startOpen(); // appel fonction maison pour initialisée la session sécurisée
     
    					$_SESSION['spseudo'] = $data['admin_pseudo'];
    					$_SESSION['alevel'] = unserialize(base64_decode($data['admin_alevel']));
     
    					mysql_free_result($prob);
    					$part = 'pass';
     
    			} else {
     
    				$part = 'relogin';
     
    			}
     
    	}
     
     
    }
     
    // a remplacer par les différentes pages html
    if ($part == 'pass') {
     
    	echo 'session ok';
     
     
    } elseif ($part == 'login') {
     
    	echo 'formulaire de login';
     
    } else {
     
    	echo 'echec du login';
     
    }
     
    ?>
     
     
     
     
     
     
     
     
    <?
    /*
    Fonctions maison pour securiser les sessions
    */
     
    //ouvre une session securisée
    function session_my_startOpen() {
     
    	//on resteint la gestion des session à l'utilisation des cookies
    	if ( ini_get('session.use_cookies') == 0 ) {
     
    		ini_set('session.use_cookies', '1');  // gestion des session par le système de cookies
     
    	}  
     
     
    	if ( ini_get('session.use_trans_sid') == 1 ) {
     
    		ini_set('session.use_trans_sid', '0'); // interdit la gestion des sessions avec GET
     
    	}    
     
    	if ( ini_get('session.use_only_cookies') == 0 ) {
     
    		ini_set('session.use_only_cookies', '1'); // utiliser seulement les cookies pour la gestion des sessions 
     
    	}
     
     
    	// on genère un nom de session aléatoir composé uniquement de chiffres, cela a pour effet
    	// de pousser php à regénérer de ssid à chaque fois 
     
    	//fonction pour generer un nombre unique aléatoire
    	function make_seed() 
    	{
        list($usec, $sec) = explode(' ', microtime());
        return (float) $sec + ((float) $usec * 100000);
    	}
     
    	srand(make_seed());
     
    	session_name(rand(10000,99999)); // longueur 5 chiffres
     
    	session_start(); // initialise la session
     
    	// on recupère l'adresse ip et on la stock pour s'en servir comme token
     
    	$_SESSION['sremoteadr'] = md5($_SERVER['REMOTE_ADDR']);
     
    }
     
     
     
    // fonction pour tester la validité d'une session
     
    function session_my_test () {
     
    		// si la variable de session qui doit contenir l'adresse ip n'existe pas, on return false tout de suite
    		if ( !session_is_registered('sremoteadr') ) {
     
    			return false;
     
    		// si la variable existe, on test sa concordance avec l'adresse ip de l'agent utilisateur
    		} elseif ( session_is_registered('sremoteadr') ) {
     
    			session_my_startRead(); //initialisation de la session 
     
    			// ladresse ip concorde on return true
    			if ( $_SESSION['sremoteadr'] == md5($_SERVER['REMOTE_ADDR']) ) {
     
    				return true;
     
    			// sinon on return false	
    			}	else {
     
    				return false;
     
    			}
     
    		}
     
     
     
    }
    ?>

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Bonjour et bienvenue sur le forum
    Juste un conseil : si tu n'as pas de question précise, il est probable que tu aies moins de réponse (surtout en postant un code un peu long).
    Si tu veux des conseils d'ordre général sur les sessions et les espaces membres, je te conseille ces tutoriels :
    Débuter avec les sessions
    Les sessions PHP4
    Authentification d'un espace membre avec PHP

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/03/2006, 21h22
  2. [MFC]Application basée sur des boites de dialogue
    Par -=Spoon=- dans le forum MFC
    Réponses: 2
    Dernier message: 24/08/2005, 11h55
  3. analyse "périodes" basées sur des dates.
    Par Yorglaa dans le forum Oracle
    Réponses: 7
    Dernier message: 22/12/2004, 11h39

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