75 votes

Prévention du détournement de session

Comment voulez-vous empêcher que plusieurs clients d'utiliser le même ID de session? Je vous pose cette question parce que je veux ajouter une couche supplémentaire de sécurité pour empêcher le détournement de session sur mon site. Si un hacker en quelque sorte les chiffres d'un autre utilisateur ID de session et fait des demandes avec SID, comment puis-je détecter qu'il y a différents clients de partager un seul SID sur le serveur et puis rejeter la tentative de détourner?

MODIFIER

J'ai accepté Gumbo de réponse après un examen attentif, parce que j'en suis venu à la réalisation que ce que je demande, c'est impossible à cause de la restriction d'un apatride protocole HTTP. Je l'avais oublié, ce qui est peut-être le principe le plus fondamental de HTTP, et maintenant que je pense à propos de cette question semble un peu trivial.

Permettez-moi de préciser ce que je veux dire:

Une fois l'Utilisateur a se connecte sur example.com il est donné quelques aléatoire ID de session, par souci de simplicité, let it be "abc123'. Cet ID de session est stocké dans un cookie sur le côté client et est validée par une session côté serveur pour vous assurer que l'utilisateur qui s'est connecté en reste connecté en tant qu'il passe d'une page à l'autre. Ce cookie bien sûr n'aurait pas besoin d'exister si HTTP n'étaient pas des apatrides. Pour cette raison, si l'Utilisateur B vole de l'Utilisateur SID, et crée un cookie sur son ordinateur avec la valeur "abc123", il aurait été détournés de l'Utilisateur de la session, mais il n'y a tout simplement aucun moyen pour que le serveur puisse légitimement reconnaître que l'Utilisateur B demande est tout différent de l'Utilisateur le demande, et donc le serveur n'a pas de raison de rejeter une demande. Même si nous étions à la liste des travaux qui étaient déjà actifs sur le serveur et essayez de voir si quelqu'un accède à une session qui est déjà active, comment pouvons-nous savoir que c'est un autre utilisateur qui accède à la session de manière illégitime et pas le même utilisateur qui est déjà ouvert une session avec un IDENTIFIANT de session, mais simplement essayer de faire une autre demande avec elle (c'est à dire naviguer vers une autre page web). Nous ne pouvons pas. La vérification de l'agent de l'utilisateur? Peut être usurpée - mais bien comme un moyen de Défense dans la mesure de la Profondeur de néanmoins. Adresse IP? Peut changer pour des raisons légitimes - mais plutôt que de ne pas la vérification de l'adresse IP à tous, je propose de le vérifier quelque chose comme les deux premiers octets de l'adresse IP, que même un utilisateur sur un plan de données de réseau qui dispose à tout moment d'un changement de propriété intellectuelle pour des raisons parfaitement légitimes serait seulement ont généralement les deux derniers octets de leur changement IP.

Dans consclusion, c'est le apatrides HTTP qui nous condamne à ne jamais être en mesure de bien protéger nos sites web à partir de détournement de session, mais les bonnes pratiques (comme ceux Gumbo a fourni) sera assez efficace pour empêcher une bonne majorité de session attaques. En essayant de protéger les séances de détournement en refusant les demandes multiples de la même SID est donc tout simplement ridicule, et irait à l'encontre de l'objectif de la séance.

91voto

Gumbo Points 279147

Malheureusement, il n'existe pas de moyen efficace pour identifier sans équivoque qu'une demande en provenance d'un attaquant en face d'une véritable demande. Parce que la plupart des propriétés que le compteur de mesures de vérification de l'adresse IP ou l'agent utilisateur caractéristiques ne sont pas fiables (adresse IP peut changer entre plusieurs demandes) ou peut être forgé facilement (e. g. User-Agent en-tête de requête) et peut donc rendement indésirables de faux positifs (j'. e. véritable utilisateur a basculé adresse IP) ou de faux négatifs (j'. e. l'attaquant a réussi à forger demande avec le même User-Agent).

C'est pourquoi la meilleure méthode pour prévenir le détournement de session est de faire en sorte qu'un attaquant ne peut pas trouver un autre utilisateur, l'ID de session. Cela signifie que vous devez concevoir votre application et de gestion de session (1), un attaquant ne peut pas deviner un ID de session valide en utilisant suffisamment d'entropie, et (2) qu'il n'y a pas d'autre moyen pour un attaquant d'obtenir un ID de session valide par les attaques connues/vulerabilities comme sniffant le réseau de communication, Cross-Site Scripting, la fuite à travers Referer, etc.

Cela dit, vous devriez:

En outre, vous devez également régénérer l'ID de session tout en invalidant l'ancien (voir session_regenerate_id de la fonction) après un certain état de la session change (e. g. la confirmation de l'authenticité après la connexion ou de la modification de l'autorisation ou de privilèges) et vous pouvez aussi le faire régulièrement pour réduire la durée d'une séance réussie détournement de l'attaque.

5voto

kanchan Points 105

Pouvons-nous faire quelque chose comme cela.

Stocker l'id de session dans la base de données. Aussi stocker l'adresse Ip et le HTTP_USER_AGENT pour que l'id de session. Maintenant, lorsqu'une demande est envoyée au serveur contenant la correspondance d'id de session, Vérifier à partir de laquelle l'agent et de l'ip, c'est à venir à partir de votre script.

Peut faire de ce funda travail en commun de la fonction ou de la classe pour la session de sorte que chaque demande est vérifiée avant d'être traité. Il serait à peine de prendre quelques micro secondes. Mais, Si de nombreux utilisateurs visitent votre site et que vous avez énorme base de données de sessions, alors ce pourrait être peu de problème de performances. Mais, Il serait sûrement être très sûr que o d'autres méthodes comme la => Utilisation de la régénération des séances.

Dans la régénération des identifiants de session, il y a encore peu de chance de détournement de session.

supposons, à la session de l'utilisateur id est copié et que l'utilisateur n'est pas de travail ou actif pendant un certain temps et aucune demande n'est faite à un serveur ancien id de session en demandant à se régénérer nouvelle. Ensuite, Dans le cas de l'id de session est détourné, hacker va utiliser l'id de session et de faire une demande à un serveur d'identification, le serveur répond avec régénéré id de session et de sorte que le hacker peut aller sur l'utilisation des services. Réelle de l'utilisateur ne sera plus en mesure de fonctionner parce qu'il est inconnu de ce que les régénérées id est et ce que demande l'id de session est transmis dans la requête. Complètement Disparu.

S'il vous plaît corrigez-moi si je m trompe quelque part.

4voto

Lèse majesté Points 4354

Il y a beaucoup de standard défenses contre le détournement de session. L'un d'eux est de faire correspondre chaque session à une seule adresse IP.

D'autres systèmes peuvent utiliser un HMAC généré à partir de:

  • l'adresse réseau de l'IP du client
  • l'-tête user-agent envoyé par le client
  • le SID
  • une clé secrète stockée sur le serveur

La raison que l'adresse réseau de l'adresse IP est utilisée dans le cas où l'utilisateur se trouve derrière un serveur mandataire, dans ce cas l'adresse IP peut changer à chaque demande, mais le réseau de l'adresse reste la même.

Bien sûr, pour être vraiment sûr, il faut vraiment forcer SSL pour toutes les demandes, de sorte que le SID ne peuvent pas être interceptées par des assaillants dans la première place. Mais tous les sites ne le faire (::toux:: Stack Overflow ::toux::).

1voto

Sk MiRaj Points 29

À mon avis, vous pouvez enregistrer l'identifiant de session dans la base de données lorsque les utilisateurs se connectent et rechercher le même identifiant avant de vous connecter. Supprimez le même identifiant de session que vous avez enregistré dans la base de données lorsque les utilisateurs se déconnectent. Vous pouvez facilement trouver l'identifiant de session de chaque utilisateur, sinon je peux vous aider.

1voto

Ratan Kumar Points 137

Une des implémentations faciles peut être réalisée en créant une table dans la base de données, en tant qu’utilisateurs connectés, puis lors de la connexion, mettez à jour cette table avec le nom de l’utilisateur et son SID, ce qui empêchera d’autres connexions en tant que même utilisateur, maintenant au moment de la déconnexion. Il suffit d'exécuter une requête simple, qui supprime les données enregistrées dans la base de données. Cela permet également de suivre l'utilisateur connecté sur votre site Web à la fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X