Salut!
Alors j'ai un gros problème avec les sessions. Après avoir lu les tutoriels de deveveloppez.com, j'ai décidé de m'y mettre. Le problème c'est que entre 2 session_start() je perds toutes les variables instanciées dans $_SESSION... Que ce soit dans la page qui suit directement ou pas.
Quelqu'un pourrais m'aider s'il vous plait?
Voici le code du formulaire:
La fonction javascript appelée se contente d'effacer le champ Password et de l'encode dans Secret.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <div> <form name="Login" method="post" action="Seraphic-Session/Authentification.php" onsubmit="javascript:submit_pass();"> <div> <input type="hidden" name="Secret" /> Login: <input type="text" name="Login" /> Mot de passe: <input type="password" name="Password" /> <input type="submit" name="Envoyer" value="Envoyer" /> </div> </form> </div>
Voici le code d'Authentification.php:
Ce script permet de loguer l'utilisateur si il existe. Jusque là tout marche, j'arrive à me loguer.
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 <?php include('Sessions.php'); function connect() { include_once("../BDD/BDD.php"); mysql_connect(SQL_HOST,SQL_USER,SQL_PASSWORD) or die('<h1>Connexion au serveur impossible.</h1>'); mysql_select_db(SQL_DATABASE) or die('<h1>Connexion impossible à la base.</h1>'); } function FormulaireValide() { return (isset($_POST['Login']) && isset($_POST['Secret'])); } function UtilisateurValide($login,$pass) { connect(); $r = mysql_query(" SELECT COUNT(*) FROM Membres WHERE Identifiant='$login' AND Password='$pass' ") or die('Echec de connection!'); mysql_close(); $r = mysql_fetch_array($r); return $r[0]==1; } function OuvrirSession($login,$pass) { session_set(); session_start(); $_SESSION['DernierAcces'] = time(); $_SESSION['IP'] = $_SERVER['REMOTE_ADDR']; connect(); $r = mysql_query(" SELECT Pseudo, Rang FROM Membres WHERE Identifiant='$login' AND Password='$pass' ") or die('Echec de connection!'); mysql_close(); $r = mysql_fetch_array($r); $_SESSION['User'] = $r['Pseudo']; $_SESSION['Rang'] = $r['Rang']; header("Location: ../admin/Article.php"); } function SessionValide() { if(!FormulaireValide() || !UtilisateurValide($_POST['Login'],$_POST['Secret'])) { header("Location: ../?page=Login.php"); die(); }else{ OuvrirSession($_POST['Login'],$_POST['Secret']); } } SessionValide(); ?>
Le script suivant contient session_set(), une fonction permettant de modifier la gestion des sessions afin d'utiliser une base de données:
Ce qui me chiffonne dans ce code pris dans le tutoriel pour les sessions avec BDD c'est que je ne vois pas d'insertion de tuples avec un INSERT.
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 function ouvrir_session($chemin_de_stockage, $nom_de_session) { $_ENV['nom_de_session'] = $nom_de_session; return true; } function fermer_session() { return true; // Rien à faire } function lire_session($identifiant_de_session) { connect(); $resultat = mysql_query(" SELECT Donnees FROM Sessions WHERE Identifiant = '".$identifiant_de_session."' AND Nom='".$_ENV['nom_de_session']."' "); $Donnees = ''; if(mysql_num_rows($resultat) == 1) { $Donnees = mysql_fetch_array($resultat); } mysql_free_result($resultat); mysql_close(); return strval($Donnees['Donnees']); } function ecrire_session($identifiant_de_session, $donnees_de_session) { connect(); $result = true; mysql_query(" UPDATE Session SET Donnees = '".$donnees_de_session."' WHERE Identifiant = '".$identifiant_de_session."' AND Nom = '".$_ENV['nom_de_session']."' ") or $result = false; mysql_close(); return $result; } function detruire_session($identifiant_de_session) { connect(); $result = true; mysql_query(" DELETE FROM Sessions WHERE Identifiant = '".$identifiant_de_session."' AND Nom ='".$_ENV['nom_de_session']."'" ) or $result = false; mysql_close(); return $result; } function verifier_validite_session($temps_de_validite) { connect(); $result = true; mysql_query(" DELETE FROM Sessions WHERE ADDDATE(DernierAcces, INTERVAL".$temps_de_validite." SECOND) < NOW() ") or $result = false; mysql_close(); return $result; } function session_set() { session_set_save_handler( 'ouvrir_session', 'fermer_session', 'lire_session', 'ecrire_session', 'detruire_session', 'verifier_validite_session' ); } ?>
Le problème est quand j'arrive à la page ../admin/Article.php: je suis immédiatement redirigé vers la page de loggin.
Voici le code du script en question:
Les fonctions ajouterArticle et modifierArticle n'ont pas de grand intêret pour ce problème, elles marchent déjà.
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 <?php include('../Seraphic-Session/VerificationSession.php'); function main() { if (!estRedacteur()) { header('Location: ..'); }else{ if (!isset($_GET["art"]) || !(estModerateur() || estAuteurDe('Article',$_GET["art"]))) { ajouterArticle(); }else{ modifierArticle($_GET["art"]); } afficheArticles(); } } main(); ?>
Pour vérifier que la session n'est pas usurpée, le script VerificationSession.php s'en charge, voici son contenu:
Vient ensuite la bibliothèque Droits.php qui permet de savoir si l'utilisateur a accès à telle ou telle page:
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 <?php include('Sessions.php'); include('Droits.php'); function VerifierSession() { if( !isset($_SESSION['DernierAcces']) || !isset($_SESSION['IP']) || !isset($_SESSION['User']) || $_SERVER['REMOTE_ADDR']!=$_SESSION['IP'] ) { $_SESSION=array(); session_destroy(); header("Location: ../?page=Login.php"); die(); } } session_set(); session_start(); VerifierSession(); $_SESSION['DernierAcces'] = time(); ?>
Les fonctions de cette bibliothèque retournent des booléens.
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 <?php function estModerateur() { if (!isset($_SESSION['Rang'])) { return false; } connect(); $r = mysql_query(" SELECT Moderateur FROM Rangs WHERE Niveau=" . $_SESSION['Rang'] )or die('Echec niveau modérateur<br />' . mysql_error()); mysql_close(); $r = mysql_fetch_array($r); return $r['Moderateur']==1; } function estRedacteur() { if (!isset($_SESSION['Rang'])) { return false; } connect(); $r = mysql_query(" SELECT Redacteur FROM Rangs WHERE Niveau=" . $_SESSION['Rang'] )or die('Echec niveau rédacteur<br />' . mysql_error()); mysql_close(); $r = mysql_fetch_array($r); return $r['Redacteur']==1; } function estMembre() { if (!isset($_SESSION['Rang'])) { return false; } connect(); $r = mysql_query(" SELECT Utilisateur FROM Rangs WHERE Niveau=" . $_SESSION['Rang'] )or die('Echec niveau membre<br />' . mysql_error()); mysql_close(); $r = mysql_fetch_array($r); return $r['Utilisateur']==1; } function estAuteurDe($Type,$id) { if (!estRedacteur() || !isset($_SESSION['User'])) { return false; }else{ connect(); $r = mysql_query(" SELECT COUNT(PosterArticle) FROM $Type WHERE Auteur=" . $_SESSION['User'] . " AND Id$Type=$id ")or die('Echec niveau auteur<br />' . mysql_error()); mysql_close(); $r = mysql_fetch_array($r); return $r[0]==1; } } ?>
Cependant, j'ai eu la mauvaise surprise de voir que mes variables n'étaient plus instanciées (je les avais instanciées dans Authentification.php)
si vous avez des idées, je vous écoute!
Merci d'avance
Partager