Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/09/2006, 04h52   #1
Invité de passage
 
Inscription : septembre 2006
Messages : 1
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1
Points : 0
Points : 0
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 :
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;
 
			}
 
		}
 
 
 
}
?>
wystt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2006, 08h10   #2
Expert Confirmé
 
Avatar de Eusebius
 
Inscription : avril 2003
Messages : 3 286
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 3 286
Points : 3 155
Points : 3 155
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
Eusebius est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h36.


 
 
 
 
Partenaires

Hébergement Web