Sécurité de transmission par $_SESSION

Eléphant du PHP | 65 Messages

04 févr. 2011, 15:57

Bonjour,

Suite à un précédent post, une recommandation m'était faite de transmettre les variables par la superglobale $_SESSION, mais celle-ci peut être modifiée facilement dans l'url.
Bon ce n'est sûrement pas un scoop pour certains d'entre vous.

Demo :

issu de CÉCILE ODERO et MAGALI CONTENSIN (PHP Solutions)

Dans page1.php

session_start();
// recuperer le parametre passé dans l'URL
$nb = isset($_GET['nb']) ? (int)$_GET['nb'] : 0;
// stocker les donnees dans des variables de session
$_SESSION['quantite'] = $nb;
$_SESSION['ref'] = 'A-06-18';


Dans page2.php

session_start();
// afficher les variables de session
foreach ($_SESSION as $cle=>$valeur) {
echo "Variable de session $cle, contenu = $valeur<br>";
}


Si le script page1.php est modifié dans l'url :
?nb=12

Cela affecte le contenu de la variable quantite.
Ce n'est pas beaucoup plus sûr que de transmettre par $_GET.

Comment y remédier alors ?

Cordialement
Jacques.

ViPHP
xTG
ViPHP | 7331 Messages

04 févr. 2011, 16:06

Le soucis de sécurité que tu présentes ne provient en aucun cas d'un soucis de session mais de passage de variable par méthode GET. ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 févr. 2011, 16:12

pour compléter, je dirais d'utiliser un formulaire en POST si tu souhaite que cela soit p lus "transparent" pour le navigateur, il te faudra gérer le fait qu'il ne faut pas prendre en compte un "refresh" de la page qui poste la quantité :)


@+
Il en faut peu pour être heureux ......

ViPHP
AB
ViPHP | 5818 Messages

04 févr. 2011, 17:52

Oui tu n'a qu'à suivre le conseil de moogli et tu n'auras plus ce problème car comme l'a fait remarquer xTG c'est dû au choix de la méthode que tu utilise pour transmettre tes variables et non pas du fait de l'utilisation des sessions.

A propos des sessions il faut éviter que l'identifiant de session passe dans l'url.

On peut essayer de mettre la mention "php_flag session.use_trans_sid off" dans un .htaccess à la racine du site.

Si pas possible (sur les mutualisés) reste la solution de vérifier que le navigateur client accepte les cookie et sinon envoyer éventuellement un message d'avertissement...