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).