PHP et identifiant de session (session ID)
Par Damien ALEXANDRE le jeudi, février 22 2007, 16:33 - DevBlog - Lien permanent
Il existe deux moyen de propagation d'un identifiant de session en PHP :
- Dans l'url (sous la forme ?PHPSESSID=a6817a3ae7b076fa5f4c797f7e8396bf)
- Par cookie
La deuxième solution est de loin la plus propre et la plus sûr, sans rentrer dans les détails, les PHPSESSID, c'est mal.
Les moteurs de recherche peuvent considérer votre contenu comme Duplicate_Content (vous auriez un nombre important d'url différentes pour la même page), c'est aussi une source d'attaque car ce genre d'url peut être stocké un peu partout, et donc être récupéré (historique du navigateur dans un cyber, logs serveur, bookmarks mais aussi attaques de type CSS). Si un internaute malveillant parvient a obtenir votre session ID, il a alors accès aux même informations que vous, c'est comme si il était loggué a votre nom.
Les PHPSESSID sont ajouté directement par PHP si votre configuration le permet, par défaut depuis PHP 4.3.0, les cookies sont utilisé en priorité, et si ils ne sont pas disponible les session ID sont ajouté au code HTML de sortie.
Un autre problème généré par ce comportement est que dans le configuration par défaut de PHP, le séparateur d'argument & n'est pas codé en HTML, cela génère donc des page non valide XHTML. Ce problème est facilement contournable :
ini_set('arg_separator.output', '&');
Php a aussi la sale habitude d'ajouter un champ <input type="hidden" juste après chaque balise <form>, c'est aussi un comportement générant des erreurs XHTML, alors plutôt que de fixer ce champ sur <form>, on peu dire a PHP de l'ajouter après chaque <fieldset> :
ini_set("url_rewriter.tags","a=href, area=href, fieldset=fakeentry, frame=src, iframe=src, input=src");
Par défaut il vaut a=href, area=href, frame=src, input=src, form=fakeentry, fieldset=
Bon voilà une bonne chose de faite, mais personnellement j'ai choisis de bannir définitivement toute forme de session ID autre que par Cookie. Ce choix implique quelques problèmes, il faut donc bien prendre en considération que les navigateurs sans support des Cookies ne pourront plus accéder aux partie de votre site protégé par session.
Cela implique aussi bien les vieux téléphone mobile que les robots d'indexation. Il faut donc avant tout changement de configuration, vérifier que les parties publiques de votre site reste accessible même sans support des Cookies.
Bloquer volontairement les parties privée de votre site avec sessions aux internautes qui ont choisi de désactiver les cookies est une lourde décision, je pense qu'elle dépend de votre site c'est donc à vous de faire ce choix.
Bref voyons comment configurer PHP pour supprimer les sessions ID des URL :
ini_set('session.use_trans_sid', "0"); //
Spécifie si le support du SID est transparent ou pas
ini_set('session.use_cookies', "1"); //
Spécifie si le module utilisera
les cookies pour stocker les données de session sur le client
ini_set('session.use_only_cookies', "1"); //
Spécifie si le module
doit utiliser seulement les cookies
pour stocker les identifiants de sessions du côté du navigateur.
En l'activant, vous éviterez les attaques qui utilisent des
identifiants de sessions dans les URL. Cette configuration a été ajoutée
en PHP 4.3.0
ini_set("url_rewriter.tags",""); // Ne plus rien réécrire dans la source
session_start(); // Ne mettre le session_start qu'après toute ces instructions
Le support des session et leur fonctionnement varie beaucoup en fonction des versions de PHP, des hébergeurs, c'est pourquoi je vous fournis ici un code qui se charge de modifier tous les paramètres concernés, dans la vraie vie il aurait suffit de mettre session.use_trans_sid à 0 dans le php.ini.
Vous pouvez aussi si vous le désirez modifier ces paramètres avec un fichier .htaccess (contenant php_flag session.use_trans_sid off).
/
Commentaires
Dsl qu'il n'y ai pas de colorisation syntaxique, un poil imbuvable :/
faudra que je test ca dès ke j'aurai un peu de temp
Bonjour,
Tout d'abord, merci pour ce petit "tutorial", il m'a été grandement utile ! Cependant, je n'ai pas le niveau pour corriger cette erreur ... Voici ce que me crache php lorsque j'instancie ma classe sid
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at e:\projet cgclc\site2\struct\Class.sid.php:2) in e:\projet cgclc\site2\struct\Class.sid.php on line 11
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at e:\projet cgclc\site2\struct\Class.sid.php:2) in e:\projet cgclc\site2\struct\Class.sid.php on line 11
class sid {
function getsid()
{
ini_set('session.use_trans_sid', '0');
ini_set('session.use_cookies', '1');
ini_set('session.use_only_cookies', '1');
ini_set('url_rewriter.tags','');
session_start();
}
}
Cette class est instancié ici
class html {
function getHtml (){
$sid = new sid;
$sid->getSid();
require 'template.php';
}
}
Merci !
"headers already sent" c'est le symptome classique de quand on ne prend pas soin de placer le session_start(); avant toute sortie d'HTML.
Le moindre espace compte.
bonjour
J'ai un problème de session dans PHP. En local, avec EasyPhp tout fonctionne bien, les variables de session passent sans problème avec Firefox. Iexplorer pose des problèmes, certaines (pas toutes) variables sont vides et une nouvelle session (semble) démarre toute seule.
Quand je mets mes pages PHP sur mon hébergeur, ni firefox ni internet explorer ne fonctionnent. Je n'ai pas d'erreur mais mes variables de session ne fonctionnent plus
J'ai un start_session() en début de chaque page. Dans mes navigateur, j'accepte les cookies et javascript.
Merci pour une réponse rapide.
Clo
Si ça ne marche pas en local, il y a de grande chances pour que ça vienne de ton code, la config par défaut d'EasyPHP est plutôt bonne il me semble.
Je te renvois vers des forum spécialisé ou tu pourra montrer ton code : lephpfacile.com, siteduzero.com
Faut abandonner EasyPHP, c'est pas super niveau config... préfrérez les suites type LAMP, WAMP ou MAMP