J'utilise un hébergement mutualisé pour un site et j'ai opté d'enregistrer les sessions dans la bd, (pour sécuriser le site et éviter l'accès aux sessions par d'autres usager de l'hébergement mutualisé).
Pour ce faire, j'ai trouvé un script sur le site de developpez.com
Je le nomme sess.php
<?php
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
//connection a la base de donnees
function _open(){
global $_sess_db;
if ($_sess_db = mysql_connect('localhost', 'root', '')) {
return mysql_select_db('ma_bd', $_sess_db);
}
return FALSE;
}
//deconnexion de la base de donnees
function _close(){
global $_sess_db;
return mysql_close($_sess_db);
}
//verifie si l'id session du user connecté correspond a l'id session enregistré
function _read($id){
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "SELECT data FROM sessions WHERE id = '$id'";
if ($result = mysql_query($sql, $_sess_db)) {
if (mysql_num_rows($result)) {
$record = mysql_fetch_assoc($result);
return $record['data'];
}
}
return '';
}
function _write($id, $data){
global $_sess_db;
$access = time();
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$data = mysql_real_escape_string($data);
$sql = "REPLACE INTO sessions VALUES ('$id', '$access', '$data')";
return mysql_query($sql, $_sess_db);
}
function _destroy($id){
global $_sess_db;
$id = mysql_real_escape_string($id);
$sql = "DELETE FROM sessions WHERE id = '$id'";
return mysql_query($sql, $_sess_db);
}
function _clean($max){
global $_sess_db;
$old = time() - $max;
$old = mysql_real_escape_string($old);
$sql = "DELETE FROM sessions WHERE access < '$old'";
return mysql_query($sql, $_sess_db);
}
?>
Au début de chaque page php, j'ai donc
<?php
include 'sess.php';
session_start();
J'aimerais savoir si cela est suffisant (voir un minima) pour un site qui nécessite une authentification pour y accéder.J'aurais bien voulu sécuriser davantage les sessions en rajoutant à la suite de
<?php
include 'sess.php';
session_start();
ce bout de code, mais cela n'a pas de sens, puisque la session est en bd.Avez-vous un conseil?
if (!isset($_SESSION['initiated']))
{
session_regenerate_id();
$_SESSION['initiated'] = true;
}
if (isset($_SESSION['HTTP_USER_AGENT']))
{
if ($_SESSION['HTTP_USER_AGENT'] != sha1($_SERVER['HTTP_USER_AGENT']))
{
header('Location: 'index.php');
exit;
}
}
else
{
$_SESSION['HTTP_USER_AGENT'] = sha1($_SERVER['HTTP_USER_AGENT']);
}