Pourquoi et quand utiliser la session_regenerate_id()
fonction en php? Dois-je toujours l'utiliser après avoir utilisé le session_start()
? J'ai lu que je devais l'utiliser pour éviter la fixation de session, est-ce la seule raison?
php
session
session-fixation
rvandoni
la source
la source
Réponses:
Qu'est-ce que c'est
session_regenerate_id()
?Comme le nom de la fonction l'indique, il s'agit d'une fonction qui remplacera l'ID de session actuel par un nouveau et conservera les informations de session en cours.
Qu'est ce que ça fait?
Il aide principalement à prévenir les attaques de fixation de session. Les attaques de fixation de session sont lorsqu'un utilisateur malveillant tente d'exploiter la vulnérabilité d'un système pour fixer (définir) l'ID de session (SID) d'un autre utilisateur. Ce faisant, ils obtiendront un accès complet en tant qu'utilisateur d'origine et pourront effectuer des tâches qui nécessiteraient autrement une authentification.
Pour éviter de telles attaques, attribuez à l'utilisateur un nouvel ID de session en utilisant
session_regenerate_id()
lorsqu'il se connecte avec succès (ou pour chaque requête X). Maintenant, il a seulement l'ID de session et votre ancien ID de session (corrigé) n'est plus valide.Quand dois-je utiliser
session_regenerate_id()
?Comme le souligne symbecean dans les commentaires ci-dessous, l'identifiant de session doit être modifié à toute transition de l'état d'authentification et uniquement aux transitions d'authentification.
Lectures complémentaires:
la source
Vous devez utiliser
session_regenerate_id()
pour arrêter le détournement de session et la fixation de session .À partir de cette réponse Security.SE :
Depuis cette page Web :
Quand utiliser
Lorsque l'utilisateur modifie / met à jour certaines entrées importantes (modification des mots de passe, des informations d'identification, des mots de passe oubliés, etc.) qui peuvent compromettre la sécurité du site ou la politique de confidentialité.
Voir également:
Guide de sécurité PHP: sessions
Fixation de session (bonne lecture)
la source
Je pense que la question de l'intoxication de session a été assez bien couverte.
Pour répondre à la question "Quand dois-je utiliser ceci?" partie, il est important de prendre du recul et de réfléchir à ce que votre application fait avec la session. Ou, pour le dire autrement, c'est la question de sécurité clé à laquelle vous devez répondre
Si tout ce que vous faites est de suivre des données autrement anonymes (l'utilisateur vient sur le site et vous les utilisez pour suivre ses visites), il n'y a aucune raison de régénérer une session. Un pirate de l'air ne gagnerait rien de valeur en saisissant cette session.
Cependant, de nombreux sites proposent des connexions. Une connexion change beaucoup de choses. Je peux accéder à mon profil. Je peux modifier les paramètres. Ainsi, un pirate de l'air peut vouloir accéder à mon compte, surtout si les utilisateurs normaux et administrateurs utilisent tous des sessions pour gérer la connexion. Ainsi, lorsque les gens viennent sur mon site et se connectent, je régénère la session. Cela ajoute une couche supplémentaire de sécurité que mon utilisateur nouvellement connecté est moins susceptible d'être détourné.
Chaque fois que nous ajoutons des données critiques à une session, vous devez envisager de régénérer l'ID de session. Si vous avez besoin de durcir votre application contre la fixation, une régénération aléatoire peut être utile mais je ne régénérerai JAMAIS à chaque demande. Par défaut, PHP stocke les sessions dans des fichiers sur le disque local. Vous ajoutez beaucoup d'E / S disque pour atténuer ce qui est un vecteur d'attaque relativement petit. Si vous avez vraiment besoin de plus de sécurité, je recommanderais d'utiliser le HTTPS complet plutôt que la régénération régulière (HTTPS rend la fixation très difficile à réaliser).
la source
Pourquoi devrais-je utiliser
session_regenerate_id
?Vous devez l'utiliser pour éviter la fixation de session .
Quand dois-je utiliser
session_regenerate_id
?Chaque fois que l'état d'authentification change, c'est principalement lors de la connexion et de la déconnexion.
Exemple
Bob est assis devant un ordinateur public et en parcourant stackoverflow.com, il y ouvre une nouvelle session. L'ID de session est enregistré dans un cookie (avec
httpOnly
indicateur pour empêcher l'accès via javascript). Imaginons que Stack Overflow ait toujours activé HTTPS ainsi que l'secure
indicateur défini pour le cookie.Comment pouvons-nous voler la session maintenant?
Bob écrit l'ID de session. Il quitte l'ordinateur sans fermer le navigateur. Maintenant, Alice arrive sur cet ordinateur et voit que Stack Overflow est déjà chargé. Elle se connecte maintenant.
Nous sommes maintenant au stade où vous devriez utiliser
session_regenerate_id
. Si vous ne créez pas un nouvel ID de session ici lors de la connexion, Bob pourrait utiliser la session précédente qu'il avait écrite pour accéder à la session d'Alice et serait connecté en tant qu'Alice maintenant.la source
session_regenerate_id()
émission, Alice peut accéder au compte bobs? Est-ce correct?Vous pouvez l'utiliser pour une meilleure sécurité.
De cette façon, vous créez des identifiants de session pour une utilisation unique.
Disons que votre identifiant de session utilisateur est = 3
Un pirate a piraté votre client et récupère son session_id. Le pirate informatique peut donc utiliser ce cookie pour utiliser sa session.
Si vous avez du code comme
vous pouvez modifier leur session chaque fois qu'ils utilisent votre site Web.
Maintenant, le pirate obtient sessionid = 3
mais vous avez changé de session après qu'il l'utilise donc votre
l'utilisateur a sessionid = 4 // auth
le pirate a session = 3 // null
Mais il y a un petit point, disons que vous utilisez la méthode de régénération et que votre client se connecte simplement au site Web et ferme le navigateur ou est inactif. Votre client a sessionid = 4 et si le pirate obtient des cookies à cet endroit, il aura le même sessionid.
Comme expliqué ci-dessus, vous pouvez protéger votre client contre le reniflement de données dans un sens, mais ce n'est toujours pas le cas pour résoudre ce problème pour de bon.
Mais ce sera beaucoup plus sûr si vous utilisez SSL enc.
Désolé pour mon mauvais anglais.
la source
Un cas d'utilisation simple:
Une session est lancée et une entrée est effectuée dans la base de données. Le panier de l'utilisateur est identifié par son identifiant de session.
Pour chaque produit ajouté, un enregistrement est réalisé dans ma table de panier. Également identifié par l'identifiant de session.
L'utilisateur a décidé de sauvegarder son panier. Il est maintenant attaché à son identifiant d'utilisateur.
L'identifiant de session est régénéré et l'utilisateur peut maintenant recommencer à créer un autre panier.
la source
la source