Il y a beaucoup de questions sur StackOverflow concernant la sécurité de session/le détournement de session, mais il ne semble pas qu'il y ait vraiment de bonne solution au problème. Les trois suggestions les plus courantes sont les suivantes:
Suivre les adresses IP des utilisateurs dans leurs données $ _SESSION et éventuellement invalider une session si elle change. L'inconvénient est que de nombreux utilisateurs ont des adresses IP dynamiques. Vous risquez donc d'invalider un utilisateur apparemment aléatoire (son point de vue).
Identique à 1., mais en utilisant un agent d'utilisateur. Deux problèmes ici: il peut ne pas y avoir d’agent utilisateur à suivre, et ils peuvent changer lors des mises à niveau du navigateur, etc.
Deuxième cookie, avec un jeton unique. Le problème ici est que si un attaquant met le cookie de session normal en attente, il sera très probablement en mesure de le faire également sur votre jeton secondaire.
Donc, avec ces trois options, il semble que l’adresse IP soit la meilleure option, puisque vous êtes assuré d’être dépassé et qu’il est indépendant de la sécurité physique (et si l’utilisateur est physiquement compromis, vous perdez quand même). Dans cet esprit, j'ai quelques questions concernant les changements d'adresse IP:
À quelle fréquence l’adresse IP d’un utilisateur changerait-elle réellement dans des conditions normales? J'ai DSL à la maison, avec les préoccupations IP habituelles et dynamiques, et selon gmail, mon adresse IP n'a pas changé en quelques jours. Autant que je sache, cela ne se produit vraiment que lorsque le modem fonctionne de toute façon, non? Cela semble être un événement assez rare pour que pourrait soit ok pour invalider la session.
Je crois me souvenir que Jeff ait dit dans l'un des SO podcasts qu'ils avaient fait quelque chose de similaire, même si c'était peut-être pour autre chose. L'idée était que l'utilisation des deux premiers octets (je crois) d'une adresse IP pouvait être considérée comme "suffisamment proche" dans certaines circonstances. Cela permet à un utilisateur de se déplacer sur le même fournisseur de services Internet, mais le système remarquerait s'il se trouvait soudainement dans une autre plage de fournisseurs de services Internet. Est-ce une tactique viable?
Je ne suis pas sûr à 100% que cela appartienne aux webmasters, mais je vais quand même y répondre.
Une adresse IP d'utilisateur ne change que lorsque sa connexion est déconnectée et redevient active. J'ai une adresse IP dynamique à la maison, mais cela fait un mois que je l'utilise depuis le redémarrage de mon routeur. Certains FAI imposent une déconnexion tous les n jours, d'autres non. C'est impossible à dire, mais de nos jours, une adresse IP dure généralement quelques jours. C’est pour cela qu’ils se sont peut-être connectés à votre site Web juste avant que leur adresse IP ne change (coupure de courant, coupure de courant sur le câble réseau, etc.), de sorte que cela n’est pas sûr.
Le gros problème que vous trouverez ici est si vous ciblez des utilisateurs mobiles. Ensuite, tous les paris sont ouverts s'ils utilisent leurs réseaux 3G ou HSPDA pour accéder à votre site.
Les deux premiers octets sont probablement assez sûrs à utiliser, mais en Australie, nous avons un FAI appelé BigPond qui est (malheureusement) le plus grand du pays. Leurs adresses IP qu'ils attribuent varient énormément, et vous ne pouvez absolument pas garantir que leurs deux premiers octets seront identiques.
Cela dit, je n'ai jamais, jamais, jamais été déconnecté de mes sites Stack Exchange sur mon iPhone, mon réseau domestique, mon ordinateur portable professionnel (même lorsque je visite différents sites ou que j'utilise HSPDA). Alors quoi qu'ils fassent, ça marche.
De plus, je n'ai jamais entendu parler de l'utilisation de l'agent utilisateur comme jeton d'authentification. Cela ne peut être qu'un partie du processus d'authentification.
Je pense que vous constaterez qu'il est généralement suffisant de disposer d'un ou deux cookies de session, à moins que vous ne fassiez quelque chose de ce fait incroyablement sécurisé que vous savez qu'il va y avoir de sérieuses tentatives de piratage contre votre site.
Les adresses IP ne peuvent changer que si le périphérique auquel l'adresse IP a été attribuée a été déconnecté et reconnecté à Internet. Cependant, cela dépendra beaucoup de vos habitudes d'utilisation et de votre fournisseur d'accès à Internet si et à quelle fréquence. Certains FAI avec des adresses IP dynamiques essaieront néanmoins de toujours vous attribuer la même adresse IP, tandis que d’autres (essayant peut-être d’obtenir des frais supplémentaires pour les adresses IP statiques) vous en délivreront une nouvelle même si vous ne déposez leur réseau que momentanément.
D'après mon expérience, un changement d'adresse IP est un événement suffisamment peu fréquent pour qu'il ne soit pas excessif d'invalider une session par dessus. Notez cependant que, sauf si votre site traite de quelque chose de sensible, cela doit tout de même être évité.
Prenez ce site par exemple, quel est le pire qui pourrait arriver si quelqu'un détourne mon compte? Un peu de vandalisme (que la communauté va rapidement écraser), peut-être une réputation perdue. Les effets sont mineurs pour l'utilisateur et l'avantage peu pour l'attaquant. Par conséquent, il serait trop agressif d'utiliser cette mesure ici.
Inversement, mon compte Google pourrait permettre à un attaquant d'accéder à toutes sortes de données privées (y compris, en bonus, l'accès à ce site). Il est donc naturel que Google soit plus prudent et (par conséquent), je lui ai souvent demandé de confirmer mon identité (bien que je reconnaisse que je n'ai aucune idée des critères utilisés).
Mon adresse IP personnelle n'a pas changé depuis plusieurs mois. Je sais qu'avec Shaw Communications (fournisseur de services Internet par câble au Canada), mon adresse IP ne change que lorsque mon adresse MAC externe est modifiée (adresse MAC du routeur ou un ordinateur directement connecté au modem) OR Je n'utilise pas mon internet pour quelques jours.
Il n'y a pas si longtemps, j'utilisais une connexion commutée et j'ai remarqué que mon adresse IP changeait à chaque fois que je me reconnectais, même si cela ne changeait pas beaucoup. Je ne sais pas si ce serait la même chose pour les combinés DSL et sans fil.
Une autre chose à considérer serait le détournement de session du même réseau local. Je ne suis pas sûr qu'il y ait vraiment quelque chose à faire à ce sujet. Certaines écoles et grandes entreprises ont beaucoup d'ordinateurs sur une seule adresse IP externe. (des ISP aussi peut-être?)
Je ne suis pas sûr de pouvoir répondre si deux octets sont sûrs à utiliser. Je serais intéressé de voir des données sur une grande base d'utilisateurs et combien leur adresse IP change.
Je ne pense pas que ce soit courant chez les fournisseurs de services Internet résidentiels, mais dans le système de proxy utilisé pour tout le trafic HTTP sortant par l'un de nos principaux clients (une banque britannique bien connue qui, pour des raisons contractuelles, devra rester anonyme à ce stade). Cela donne parfois l’impression que les utilisateurs changent d’adresse IP toutes les quelques minutes, parfois même au milieu d’un bloc de requêtes de sous-objets (images, etc.) sur la même page. Il est donc préférable d’utiliser l’adresse IPv4 exacte dans le cadre de votre le suivi de session est une mauvaise idée au cas où certains de vos utilisateurs seraient en retard sur un arrangement similaire.
Dans le cas où nous avons vu les adresses indiquées se situer dans la même plage/24, et non dans la plage entière, bien que pour plus de sécurité, je vous recommande de vous en tenir au plus aux deux premiers octets de l'adresse IP.
Même dans ce cas, vous pourriez déranger les gens s’ils utilisent votre application en voyageant. Par exemple, j'ai parfois une session de messagerie Web ouverte lorsque je voyage avec mon netbook - cela peut commencer sur mon réseau domestique sans fil, puis passer au réseau sans fil gratuit de la gare, puis à mon fournisseur de téléphonie mobile si le train dans lequel je me trouve n'est pas allumé -board sans fil, puis vers un autre point d'accès sans fil gratuit, puis vers le réseau que j'utilise à ma destination. Tout cela sans jamais me déconnecter de Zimba (il est juste là et travaille à chaque fois que je désactive le netbook et que je me connecte à tout ce qui est disponible) - je pourrais basculer entre quelques/16 sur un tel voyage. Bien sûr, il s’agit d’un cas Edge qui risque de ne jamais affecter suffisamment d’utilisateurs pour qu’il soit intéressant de le prendre en compte dans vos plans - en particulier si tous les utilisateurs, à l’exception des plus difficiles, auraient besoin de se reconnecter lorsqu’ils basculent d’un réseau domestique vers un réseau mobile. .
Le détournement de session est difficile à bloquer complètement. Si le pirate peut inspecter le trafic entre le client et le serveur , tout ce que vous envoyez par un canal non crypté est facile à imiter et si le pirate a ont réussi à travailler à partir d'un hôte sur la route entre le client et le serveur, ils pouvaient même simuler des requêtes semblant provenir de la bonne adresse IP, de sorte que cela ne vous aiderait pas toujours. Pour arrêter complètement le détournement de session, vous devez utiliser HTTPS (et si vous voulez vous sentir vraiment paranoïaque: si l'attaquant dispose d'un moyen d'accéder à votre certificat HTTPS ou de le simuler, cela n'arrête pas les attaques basées sur le proxy de démarrage de session MiTM). Je suppose que vous pouvez aussi implémenter quelque chose comme l’échange de clé DH pour choisir une clé partagée sans la transmettre, et l’utiliser avec l’heure actuelle plus un peu de sel pour créer un hachage que le serveur peut authentifier, mais je doute fort que ce soit pratique ( sur un processeur décent avec un moteur JS moderne, comme dans FF3.5 +, Chrome ou similaire, vous pourrez peut-être effectuer l’échange DH initial pour les tailles de clé utiles assez rapidement, mais aucun utilisateur mobile IE ne pourra pouvoir entrer dans une semaine).
Un dernier problème avec l’utilisation de l’adresse IP du demandeur dans le suivi de votre session: s’ils se trouvent derrière un arrangement NAT, ils pourraient partager cette adresse IP avec des centaines d’utilisateurs. Lorsque je suis connecté à mon fournisseur 3G, je reçois une adresse dans la plage 10.xxx, qui reste officiellement non écoutée. Je ne sais pas combien d’adresses grand public pourraient être perçues comme telles, mais il est possible que je partage une adresse publique avec des milliers de personnes. les gens à ce stade (je n'aurai certainement pas une adresse publique à moi-même).
Bref récit: l'adresse IP du client n'est pas aussi bonne qu'on pourrait le penser pour les sessions de suivi, bien que l'utilisation des deux premiers octets offrirait une protection supplémentaire par-dessus les autres jetons de session que vous utiliserez, sans toutefois gêner plus d'un peu d'utilisateurs.