Sessions
PHP Manual

Sessions et sécurité

Lien externe : » Session fixation

La gestion des sessions HTTP est au coeur de la sécurité sur le Web. Des mesures d'atténuation doivent être prises en compte afin d'assurer la sécurité des sessions. Les développeurs doivent activer/utiliser les paramètres de configuration appropriés.

Le module de session ne garantie pas que l'information stockée dans une session n'est seulement vue que par l'utilisation qui l'a créée. Vous devez prendre des mesures complémentaires pour protéger activement la confidentialité de la session, suivant la valeur associée.

Évaluer l'importance des données transportées par vos sessions et déployez des protections supplémentaires -- cela a généralement un prix, et réduit la commodité pour l'utilisateur. Par exemple, si vous voulez protéger les utilisateurs de simples tactiques d'ingénierie sociale, vous devez activer session.use_only_cookies. Dans ce cas, les cookies doivent obligatoirement être activés côté utilisateur, sinon les sessions ne fonctionneront pas.

Il y a plusieurs façons d'exposer un ID de session existant vers une autre partie de votre site. Il lui sera alors possible d'accéder à toutes les ressources associées avec cet ID spécifique. Tout d'abord, les URLs contiennent les IDs de session. Si vous liez vers un site externe, l'URL incluent l'ID de session peut être stockée dans les logs du serveurs externes via le referrer. Deuxièmement, un attaquant plus actif peut écouter votre traffic réseau. S'il n'est pas crypté, les IDs de session vont transiter en clair sur le réseau. La solution ici est d'implémenter SSL sur votre serveur et le rendre obligatoire pour les utilisateurs. HSTS peut être utilisé pour cela.

Depuis PHP 5.5.2, session.use_strict_mode est disponible. Lorsqu'il est actif, et que le module de gestionnaire de sauvegarde le supporte, les IDs de session non initialisés seront rejectés et un nouvel ID de session sera créé. Cela protège des attaques en forcant l'utilisateur à utiliser un ID de session connu. Les attaquants peuvent passer des liens ou envoyer des mails qui contiennent un ID de session. i.e. http://example.com/page.php?PHPSESSID=123456789 Si session.use_trans_sid est actif, la victime va démarrer une session en utilisant l'ID de session fourni par l'attaquant. session.use_strict_mode limite ce type de risque.

Malgré le fait que session.use_strict_mode limite les risques, les attaquants peuvent forcer les utilisateurs à utiliser un ID de session initialisé, créé par l'attaquant. Tout ce que l'attaquant a à faire est d'initialiser un ID de session avant l'attaque et de le garder actif.

Le cookie d'ID de session peut être défini avec des attributs de domaine, de chemin, en HTTP seulement, et de sécurité. C'est la priorité définie par les navigateurs. En utilisant la priorité, l'attaquant peut définir l'ID de session qui peut être utilisé de façon permanente. L'utilisation de session.use_only_cookies ne va pas résoudre ce problème. session.use_strict_mode va limiter ce risque. Avec session.use_strict_mode=On, l'ID de session non initialisé ne sera pas accepté. Le module de session créera tojours un nouvel ID de session lorsque l'ID de session n'est pas initialisé par le module de session. Ceci peut résulter en un Dos pour la victime, mais un DoS est plus acceptable qu'un compte compromis.

session.use_strict_mode est un bon compromis, mais n'est pas suffisant pour les sessions authentifiées. Les développeurs doivent utiliser la fonction session_regenerate_id() pour l'authentification. session_regenerate_id() doit être appelée avant de définir les informations d'authentification à $_SESSION. La fonction session_regenerate_id() assure que la nouvelle session contient les informations d'authentification stockées seulement dans une nouvelle session. i.e. Les erreurs durant le processus d'authentification peut sauvegarder les drapeaux authentifiés dans l'ancienne session.

L'appel à la fonction session_regenerate_id() peut résulter en un DoS personnel comme use_strict_mode=On. Cependant, un DoS est préférable à un compte compromis. L'ID de session doit être re-généré au moins lors de l'authentification La re-génération de l'ID de session réduit le risque de son vol, ceci pouvant être périodiquement appelé. Les développeurs ne doivent pas se fier à l'expiration de l'ID de session. Les attaquants peuvent accéder à l'ID de session périodiquement pour éviter son expiration. Les développeurs doivent implémenter leurs propres fonctionalités d'expiration pour les anciennes sessions.

Notez que la fonction session_regenerate_id() ne supprime pas les anciennes sessions par défaut. Les anciennes sessions d'authentification peuvent être disponibles pour utilisation. Si le développeur veut éviter l'utilisation d'anciennes sessions d'authentification par quiconque, il doit détruire la session en définissant l'option delete_old_session à TRUE. Cependant, l'effacement immédiat des anciennes sessions a des effets de bord. La session peut disparaîte lors de connexions concurrentes à l'application Web et/ou lorsque le réseau devient instable. Au lieu de supprimer immédiatement les anciennes sessions, vous pouvez définir un délai d'expiration très court dans $_SESSION vous même. Si l'utilisateur accède à une session obsolète (session expirée), vous interdisez son accès.

session.use_only_cookies et une bonne utilisation de session_regenerate_id() peuvent engendrer un DoS personnel. Lorsque c'est le cas, vous pouvez demander à l'utilisateur de supprimer les cookies et alerter les utilisateurs qu'il y a un éventuel risque quant à la sécurité. Les attaquants peuvent définir des cookies malicieux via des applications Web vulnérables (i.e. injection JavaScript), via des plugins de navigateur vulnérables/malicieux, etc...

Les développeurs ne doivent pas utiliser un ID de session avec une grande durée de vie pour l'identification automatique car il accroit les risques de vol de session. L'auto-identification doit être implémentée par le développeurs. Utilisez une clé de hashage sécurisé à usage unique pour l'auto-identification en utilisant les cookies. Utilisez un hashage fort et plus sécurisé que SHA-2. i.e. SHA-256 ou supérieurs avec des données aléatoires provenant de /dev/urandom ou équivalent. Si l'utilisateur n'est pas authentifié, vérifiez si la clé d'auto-identification sécurisé à usage unique est valide ou non. Si la clé est valide, authentifiez l'utilisateur et définissez une nouvelle clé d'auto-identification à usage unique. La clé d'auto-identification est une clé d'authentification avec une grande durée de vie ; elle doit être protégée autant que possible. Utilisez les attributs path/httponly/secure des cookies pour la protéger. Le développeur doit implémenter la fonctionalité qui désactive l'auto-identification et qui supprime les cookies contenant les clés d'auto-identification non nécessaire pour les utilisateurs.


Sessions
PHP Manual