Pertes des variables de session entre 2 session_start()
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:
Code:
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> |
La fonction javascript appelée se contente d'effacer le champ Password et de l'encode dans Secret.
Voici le code d'Authentification.php:
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
| <?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();
?> |
Ce script permet de loguer l'utilisateur si il existe. Jusque là tout marche, j'arrive à me loguer.
Le script suivant contient session_set(), une fonction permettant de modifier la gestion des sessions afin d'utiliser une base de données:
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
| <?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'
);
}
?> |
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.
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:
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
| <?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();
?> |
Les fonctions ajouterArticle et modifierArticle n'ont pas de grand intêret pour ce problème, elles marchent déjà.
Pour vérifier que la session n'est pas usurpée, le script VerificationSession.php s'en charge, voici son contenu:
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
| <?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();
?> |
Vient ensuite la bibliothèque Droits.php qui permet de savoir si l'utilisateur a accès à telle ou telle page:
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
| <?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;
}
}
?> |
Les fonctions de cette bibliothèque retournent des booléens.
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 :mrgreen: