Quelles sont les lignes directrices pour maintenir une sécurité de session responsable avec PHP? Il y a des informations partout sur le web et il est temps que tout soit arrivé au même endroit!
Réponses
Trop de publicités?Il ya un couple de choses à faire afin de garder votre session sécurisée:
- Utiliser SSL pour l'authentification des utilisateurs ou d'effectuer des opérations sensibles.
- Régénérer l'id de session à chaque fois que le niveau de sécurité des modifications (comme la connexion). Vous pouvez même régénérer l'id de session à chaque demande, si vous le souhaitez.
- Avez sessions
- N'utilisez pas de register globals
- Stocker les informations d'authentification sur le serveur. C'est, de ne pas envoyer les détails tels que le nom d'utilisateur dans le cookie.
- Vérifier l'
$_SERVER['HTTP_USER_AGENT']
. Cela ajoute une petite barrière pour détournement de session. Vous pouvez également vérifier l'adresse IP. Mais cela pose des problèmes pour les utilisateurs qui ont changer d'adresse IP en raison de l'équilibrage de charge sur plusieurs connexions internet etc (ce qui est le cas dans notre environnement, ici). - Verrouiller l'accès à la session sur le système de fichiers ou l'utilisation de session personnalisé de manutention
- Pour les opérations sensibles envisager d'exiger que les utilisateurs connectés à fournir à leurs authenication à nouveau les détails de
Une directive consiste à appeler session_regenerate_id chaque fois que le niveau de sécurité d'une session change. Cela permet d'éviter le détournement de session.
Je pense que l'un des problèmes majeurs (qui est traitée dans PHP 6) est register_globals. Actuellement l'une des méthodes standard utilisées pour éviter register_globals
est d'utiliser l' $_REQUEST
, $_GET
ou $_POST
tableaux.
La "bonne" façon de faire (de 5.2, même si il est un peu buggé là, mais stable que de 6, ce qui est à venir bientôt) est grâce à des filtres.
Ainsi, au lieu de:
$username = $_POST["username"];
vous feriez:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
ou même juste:
$username = filter_input(INPUT_POST, 'username');
Mes deux (ou plus) cents:
- Ne faites confiance à personne
- Filtre d'entrée, échapper à la sortie (cookies, les données de session sont vos commentaires trop)
- Éviter les attaques de type XSS (conserver votre code HTML bien formé, jetez un oeil à PHPTAL ou HTMLPurifier)
- Défense en profondeur
- Ne pas exposer les données
Il est minuscule mais bon livre sur ce sujet: Essentiel PHP Security by Chris Shiflett.
Sur la page d'accueil de ce livre, vous trouverez d'intéressants exemples de code et des exemples de chapitres.
Vous pouvez utiliser la technique mentionnée ci-dessus (l'IP et le UserAgent), décrit ici: Comment éviter le vol d'identité
Ce document de fixation de session contient de très bons pointeurs d’attaque. Voir aussi la page de fixation de session sur Wikipedia .