Page 1 sur 1

Session en base de données et sécurité

Posté : 27 janv. 2009, 23:19
par rolusseum
Bonsoir,

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']);
}

Posté : 27 janv. 2009, 23:53
par dunbar
Salut
le session_start() doit être avant tout code

Posté : 27 janv. 2009, 23:56
par rolusseum

Posté : 28 janv. 2009, 00:07
par dunbar
:oops: Autant pour moi

Posté : 28 janv. 2009, 09:51
par Ripat
Si ton mutualisé est compromis au point que d'autres usagers ont accès à ton session.save_path il est fort à parier que ton répertoire de scripts php est mort aussi. Et donc également le script plus haut qui contient le mdp root pour ta bdd MySQL et là tu as de vrais soucis à te faire! :wink:

Posté : 28 janv. 2009, 17:02
par Aureusms
Je suis d'accord :
Si ça craint autant : pas de mot de passe dans les scripts...

Posté : 29 janv. 2009, 00:09
par rolusseum
Si ton mutualisé est compromis au point que d'autres usagers ont accès à ton session.save_path
C'est à dire par défaut le dossier de sauvegarde des sessions: /tmp
il est fort à parier que ton répertoire de scripts php est mort aussi. Et donc également le script plus haut qui contient le mdp root pour ta bdd MySQL et là tu as de vrais soucis à te faire!
L'enregistrement en base de données des sessions, finalement ne sert à rien?
Quelles sont vos pratiques ou principes pour protéger les sessions avec un hébergement mutualisé?

Posté : 29 janv. 2009, 10:09
par Ripat
Rien. On croise les doigts en espérant qu'aucun des colocataires ne réussira une "escalade root" (réussir à se donner les droits root) parce que dans ce cas c'est tout le mutualisé qui est compromis. Et pas seulement le répertoire /tmp. Tout dépend du sérieux de l'hébergeur. Pour les sessions tu pourrais envisager de les crypter, par exemple avec la bibliothèque mbcrypt mais, une fois encore, c'est une protection illusoire car si tu le fais pour te protéger d'une intrusion sur le répertoire /tmp, le pirate qui y aurait accès aura également accès à l'ensemble du serveur, donc de tes mots de passe, y compris aux clés de chiffrement de tes routines de cryptage.

Par contre, il est plus malin d'investir un peu de temps dans l'étude et la protection contre les vols de sessions par XSS (Cross Site Scripting), ou de te protéger contre les injections SQL.

Quand on se met sur le net il faut accepter un certain niveau de risque. Le tout est de le limiter autant que faire se peut. Le pire est de faire quelque-chose de parfaitement inutile et de s'endormir tranquillement en pensant être bien protégé. Ne *jamais* s'endormir. Jamais. Il faut toujours remettre en question les mesures sécuritaire que l'on a mises en place. Tester, vérifier les logs, tester encore, s'informer etc...

Posté : 29 janv. 2009, 23:56
par rolusseum
Merci Ripat pour ton point de vue.
Je vais étudier les possibilités de protections "utiles" qui existent.
Et surtout, je garde un oeil ouvert :wink: