web-dev-qa-db-fra.com

Quand et pourquoi devrais-je utiliser session_regenerate_id ()?

Pourquoi et quand devrais-je utiliser la fonction session_regenerate_id() en php? Devrais-je toujours l'utiliser après avoir utilisé le session_start()? J'ai lu que je devais l'utiliser pour empêcher la fixation de session, est-ce la seule raison?

84
rvandoni

Qu'est-ce que session_regenerate_id()?

Comme le nom de la fonction l'indique, il s'agit d'une fonction qui remplacera l'ID de session en cours par un nouvel identificateur et conservera les informations de la session en cours.

Qu'est ce que ça fait?

Il aide principalement à prévenir les attaques par fixation de session. Un utilisateur malveillant tente d'exploiter la vulnérabilité d'un système pour réparer (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 sinon une authentification.

Pour empêcher de telles attaques, attribuez à l'utilisateur un nouvel identifiant de session à l'aide de session_regenerate_id() lorsqu'il s'est connecté avec succès (ou pour chaque demande X). Maintenant, il n’a plus que l’ID de session et votre ancien ID de session (corrigé) n’est plus valide.

Quand devrais-je utiliser session_regenerate_id()?

Comme le souligne symbecean dans les commentaires ci-dessous, l'ID de session doit être modifié à chaque transition de l'état d'authentification et seulement aux transitions d’authentification.

Lectures complémentaires:

83
Amal Murali

Vous devez utiliser session_regenerate_id() pour arrêter le détournement de session et la fixation de la session .

De cette réponse Security.SE :

Le détournement de session consiste à voler le cookie de session. Cela est plus facile à réaliser lors du partage d’un réseau local avec d’autres ordinateurs. Par exemple. chez Starbucks. Exemple ... un utilisateur avec la session Y navigue sur le site Web de James chez Starbucks. Je suis à l'écoute de leur trafic réseau, sirotant mon café au lait. Je prends l'utilisateur avec les cookies de la session Y pour le site Web de James et configure mon navigateur pour qu'il les utilise. Maintenant, quand j'accède au site de James, le site de James.

De cette page Web :

La fixation de session est une technique d’attaque qui force l’identifiant de session d’un utilisateur à une valeur explicite. En fonction de la fonctionnalité du site Web cible, plusieurs techniques peuvent être utilisées pour "corriger" la valeur de l'ID de session. Ces techniques vont des exploits de script intersite à l’ajout de requêtes HTTP précédemment effectuées au site Web. Une fois l’identifiant de session d’un utilisateur corrigé, l’attaquant attendra que cet utilisateur se connecte. Une fois que l'utilisateur le fait, l'attaquant utilise la valeur prédéfinie de l'ID de session pour assumer la même identité en ligne.

Quand utiliser

Lorsque l'utilisateur modifie/met à jour certaines entrées importantes (modification des mots de passe, informations d'identification, mots de passe oubliés, etc.) susceptibles de compromettre la sécurité du site ou la politique de confidentialité.

Voir également:

Guide de sécurité PHP: Sessions

Session Fixation (Nice read)

21
Dimag Kharab

Je pense que la question de l'intoxication de session a été assez bien couverte.

Pour répondre à la question "Quand devrais-je utiliser ceci?" partie, il est important de prendre du recul et d'examiner ce que votre application fait avec la session. Autrement dit, c’est la question de sécurité essentielle à laquelle vous devez répondre.

Que gagnerait-il si quelqu'un réussissait cette session?

Si tout ce que vous faites est de suivre des données anonymes (l'utilisateur vient sur le site et vous l'utilisez pour suivre leurs visites), il n'y a donc aucune raison de régénérer une session. Un pirate de l'air ne gagnerait rien de valeur en saisissant cette session.

Cependant, beaucoup de sites proposent des connexions. Un login change beaucoup de choses. Je peux accéder à mon profil. Je peux changer les paramètres. Ainsi, un pirate de l'air voudra peut-être accéder à mon compte, surtout si les utilisateurs normaux et administrateurs utilisent tous des sessions pour gérer la connexion. Ainsi, lorsque des personnes visitent mon site et se connectent, je régénère la session. Cela ajoute une couche de sécurité supplémentaire pour que mon utilisateur récemment connecté soit moins susceptible d'être piraté.

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érerais JAMAIS à chaque requête. Par défaut PHP stocke les sessions dans des fichiers sur le disque local. Vous ajoutez de nombreuses E/S sur disque pour atténuer ce qui est un vecteur d'attaque relativement petit. Si vous aviez vraiment besoin de plus de sécurité, préconiser de passer du HTTPS complet à la régénération régulière (le HTTPS rend la fixation très difficile à retirer).

17
Machavity

Pourquoi devrais-je utiliser session_regenerate_id?

Vous devriez l’utiliser pour prévenir fixation de session .

Quand devrais-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 naviguant sur stackoverflow.com, il y ouvre une nouvelle session. L'identifiant de session est enregistré dans un cookie (avec l'indicateur httpOnly pour empêcher l'accès via javascript). Imaginons que Stack Overflow ait toujours activé HTTPS et que le drapeau secure soit 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 vient sur cet ordinateur et constate que Stack Overflow est déjà chargé. Elle se connecte maintenant.

Nous en sommes maintenant au stade où vous devriez utiliser session_regenerate_id. Si vous ne créez pas de nouvel ID de session ici lors de la connexion, Bob pourrait utiliser la session précédente qu'il avait notée pour accéder à la session d'Alice et serait maintenant connecté en tant qu'Alice.

12
kelunik

Un cas d'utilisation simple:

// User visits a webshop
$shopcart = new Cart();

Une session est démarrée et une entrée est faite dans la base de données. Le panier de l'utilisateur est identifié par son identifiant de session.

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

Pour chaque produit ajouté, un enregistrement est effectué dans mon tableau de panier. Identifié également par l'identifiant de session.

// User saves cart in order to use it later
$shopcart->save();

L'utilisateur a décidé de sauvegarder son panier. Il est maintenant attaché à son identifiant utilisateur.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

L'identifiant de session est régénéré et l'utilisateur peut maintenant recommencer à créer un autre panier.

11
Peter

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 informatique a piraté votre client pour obtenir son identifiant de session. Ainsi, les hackers peuvent utiliser ce cookie pour utiliser leur session.

Si vous avez un code comme

session_start();
session_regenerate_id();

vous êtes en mesure de changer de 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 pour que votre

utilisateur possède sessionid = 4 // auth

hacker a session = 3 // null

Mais il y a un petit point, disons que vous utilisez la méthode regenerate et que votre client se connecte simplement au site Web et ferme le navigateur ou est inactif. Votre client a sessionid = 4 et si un pirate informatique obtient des cookies sur cette partie, il aura le même identifiant de session.

Comme expliqué ci-dessus, vous pouvez protéger votre client contre le sniffing de données d'une manière, mais cela ne résoudra pas le problème pour toujours.

Mais ce sera beaucoup plus sûr si vous utilisez SSL enc.

Désolé pour mon mauvais anglais.

11
Hasan Veli Soyalan

session_regenerate_id (): impossible de régénérer l'identifiant de session - la session n'est pas active

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
4
Anton