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
|
<?php
$Table_sess="session_user"; // nom de la table contenant les sessions
$BASE_sess="forum"; // nom de la base SQL contenant la table
function startSessionUser($SESSNAME, $login) {
//On nettoie les sessions précédentes de la personne :
include("mysql.php");
$db = mysql_connect($INFO["host"],$INFO["user"],$INFO["password"])or die("Impossible de se connecter : " . mysql_error());
mysql_select_db($INFO["database"],$db);
$query="DELETE FROM session_user
WHERE login='$login'
AND SESSNAME='$SESSNAME';"; //permet de distinguer 2 sessions distinctes du même utilisateur par le nom leur session ($SESSNAME)
$result=mysql_query($query) or die("Impossible d'effectuer requete DELETE dans la table $Table_sess pour nettoyage.");
if (!$result) NiceError ("Erreur: !\$result après requête DELETE dans la table $Table_sess pour nettoyage.");
// CleanTable(); //Nettoie les sessions périmées des utilisateurs ne s'étant pas déconnectés convenablement.
//On débute la session en l'inscrivant dans la table :
//Génère un identificateur de session unique : $SESSID
mt_srand((float) microtime()*1000000); //Initialise le générateur de nombres aléatoires
$SESSID=mt_rand(1111111111, 99999999999); //Génère un nombre aléatoire 'unique' entre 1111111111 et 99999999999
$SESSstart=time(); // Relève l'heure de début de la session sous forme d'horodateur unix.
$IP=$_SERVER["REMOTE_ADDR"]; //Relève l'adresse IP de la personne pour éviter un détournement
//Prend et crypte l'empreinte du navigateur de l'utilisateur pour éviter un détournement de session :
$hash=md5($_SERVER["HTTP_USER_AGENT"]."mix"); //ajoute le grain de sel au type de browser
$query="INSERT INTO session_user VALUES ('', '$SESSID', '$login', '$IP', '$SESSstart', '$SESSstart', '$SESSNAME', '$hash');";
$result = mysql_query($query) or die ("Erreur $query invalide");
if (setcookie($SESSNAME."-LOGIN", "$login", $SESSstart+3600)) //cookie pour stoquer le login
if (setcookie($SESSNAME."-SESSNAME", "$SESSNAME", $SESSstart+3600)) //cookie pour stoquer le nom de la session
if (setcookie($SESSNAME."-SESSID", "$SESSID", $SESSstart+3600)) //cookie pour stoquer l'ID de la session
echo "";
else echo "Le navigateur n'accepte pas les cookies!1";
else echo "Le navigateur n'accepte pas les cookies!2";
else echo "Le navigateur n'accepte pas les cookies!3";
//Met à disposition les variables concernant la session :
define("SESSlogin", "$login");
define("SESSname", "$SESSNAME");
define("SESSid", "$SESSID");
define("SESSstart", "$SESSstart");
return TRUE;
}
function checkUser($SESSNAME) {
//Récupère les informations d'authentification de l'utilisateur par cookie ou chaîne de requête
if(isset($_COOKIE[$SESSNAME."-SESSID"]) && isset($_COOKIE[$SESSNAME."-LOGIN"]) && isset($_COOKIE[$SESSNAME."-SESSNAME"]))
{
$PHPSESSID=$_COOKIE[$SESSNAME."-SESSID"];
$PHPSESSLOGIN=$_COOKIE[$SESSNAME."-LOGIN"];
$PHPSESSNAME=$_COOKIE[$SESSNAME."-SESSNAME"];
}
else
{
$PHPSESSID="";
$PHPSESSLOGIN="";
$PHPSESSNAME="";
}
require("mysql.php");
$db = mysql_connect($INFO["host"],$INFO["user"],$INFO["password"])or die("Impossible de se connecter : " . mysql_error());
mysql_select_db($INFO["database"],$db);
$ip=$_SERVER["REMOTE_ADDR"];
$hash=md5($_SERVER["HTTP_USER_AGENT"]."mix"); //génère le hash et ajoute le grain de sel
$query="SELECT * FROM session_user
WHERE SESSID='$PHPSESSID'
AND login='$PHPSESSLOGIN'
AND IP='$ip'
AND SESSNAME='$PHPSESSNAME'
AND hash='$hash'"; //Génère la requête SQL
$result = mysql_query($query)or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());;
@$num_lignes = mysql_num_rows($result);
/*Quitte si PHPSESSID inconnu ou si PHPSESSLOGIN incorrect ou si adresse IP différente de la personne ayant initialisé la session(anti hijhack),
ou si $hash ne correspond pas, ou si $SESSNAME n'a aucune session d'initialisée
-- en fait quitte si aucune entrée de la table ne correspond. */
if ($num_lignes==0) {
deleteSession($SESSNAME);
//~ header("location:index.php?expirer=3");
}
//Vérifie si la session n'est pas restée trop longtemps inutilisée : si LastOn (la derniere requete d'authentification dans checkuser) est plus vieille que l'heure courante passée de 30 minutes (1800 secondes).
$ligne=mysql_fetch_array($result);
if (($ligne["LastOn"] + 1800) < time()) {
//durée sans rafraichissement (1800)
deleteSession($SESSNAME);
//~ header("location:index.php?expirer=1");
}
if (($ligne["SESSstart"] + 3600) < time()) {
//durée max=1 heure (3600) même avec rafraichissement (anti-hack), on n'est jamais trop prudent
deleteSession($SESSNAME);
//~ header("location: index.php?expirer=2");
}
//Autentification OK : on remet à jour LastOn :
$t=time();
$id=$ligne["id"];
$query="UPDATE session_user SET LastOn='$t' WHERE id='$id'";
$result=mysql_query($query);
if (!$result) echo("Impossible de remettre votre session à jour. Veuillez vous reconnecter. CODE 3");
//Met à disposition les variables concernant la session :
if(! defined("SESSlogin"))
define("SESSlogin", "$PHPSESSLOGIN");
if(! defined("SESSname"))
define("SESSname", "$SESSNAME");
if(! defined("SESSid"))
define("SESSid", "$PHPSESSID");
if(! defined("SESSstart"))
define("SESSstart", $ligne["SESSstart"]);
}
function deleteSession($SESSNAME) {
global $Table_sess,$BASE_sess; //Récupère les variables globales de configuration
if(isset($_COOKIE[$SESSNAME."-SESSID"]) && isset($_COOKIE[$SESSNAME."-LOGIN"]) && isset($_COOKIE[$SESSNAME."-SESSNAME"]))
{
$login=$_COOKIE[$SESSNAME."-LOGIN"]; //Récupère le login de l'utilisateur par cookie
//On supprimme la session côté client
//1- On altère les données (de cette façon, si la suppression des cookies ne fonctionne pas, la session est quand meme désactivée)
setcookie($SESSNAME."-LOGIN", "no_login", 0); //cookie pour stoquer le login
setcookie($SESSNAME."-SESSNAME", "no_session", 0); //cookie pour stoquer le nom de la session
setcookie($SESSNAME."-SESSID", "no_id-session-", 0); //cookie pour stoquer l'ID de la session
//2- On tente de supprimmer les cookies
setcookie($SESSNAME."-LOGIN"); //cookie pour stoquer le login
setcookie($SESSNAME."-SESSNAME"); //cookie pour stoquer le nom de la session
setcookie($SESSNAME."-SESSID"); //cookie pour stoquer l'ID de la session
}
else
{
$login=$_SESSION["login"];
}
//3- On supprimme la session côté serveur
include("mysql.php");
$db = mysql_connect($INFO["host"],$INFO["user"],$INFO["password"])or die("Impossible de se connecter : " . mysql_error());
mysql_select_db($INFO["database"],$db);
//On nettoie la session de la personne :
$query="DELETE FROM session_user WHERE login='$login' AND SESSNAME='$SESSNAME'";
$result=mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
if (!$result) echo("Erreur: !\$result après requête DELETE pour terminer la session.");
}
function cleanTable() {
$time_on=time() - 600; //heure courante moins 10 minutes
$time_out=time() - 3600; //heure courante moins 1 heure
include("connexion.php");
//on efface toute session inactive, c'est à dire dont l'heure de création a plus d'une heure.
$query="DELETE FROM session_user WHERE SESSstart > $time_out OR LastOn > $time_on";
$res=mysql_query($query) or die ("Erreur $query invalide");
}
?> |
Partager