Ok, il y a deux distincts, mais liés à des problèmes, et chacun est traité différemment.
Fixation De Session
C'est là un attaquant définit explicitement l'identifiant de session d'une session pour un utilisateur. Généralement en PHP c'est fait en leur donnant une url de la forme http://www.example.com/index...?session_name=sessionid
. Une fois que l'attaquant donne l'url pour le client, l'attaque est le même comme un détournement de session d'attaque.
Il ya quelques façons de prévenir la fixation de session (faire tous les d'entre eux):
Ensemble session.use_trans_sid = 0
votre php.ini
le fichier. Ceci va dire à PHP de ne pas inclure l'identifiant dans l'URL, et de ne pas lire les URL pour les identificateurs.
Ensemble session.use_only_cookies = 1
votre php.ini
le fichier. Ceci va dire à PHP de ne jamais utiliser des Url avec des identifiants de session.
-
Régénérer l'ID de session à tout moment de la séance avec les changements d'état. Qu'entend de ce qui suit:
- L'authentification de l'utilisateur
- Le stockage d'informations sensibles dans la session
- Changer quoi que ce soit à propos de la session
- etc...
Détournement De Session
C'est là un attaquant obtient une emprise d'un identifiant de session et est capable d'envoyer des demandes comme si elles étaient de cet utilisateur. Cela signifie que, puisque l'attaquant a l'identificateur, ils sont tous, mais impossible à distinguer de l'utilisateur valide par rapport au serveur.
Vous ne pouvez pas directement de prévenir le détournement de session. Vous pouvez cependant mettre suit en, il est très difficile et plus difficile à utiliser.
Utilisez une forte session de hachage identifiant: session.hash_function
en php.ini
. Si PHP < 5.3, il session.hash_function = 1
pour SHA1. Si PHP >= 5.3, il session.hash_function = sha256
ou session.hash_function = sha512
.
Envoyer une forte hash: session.hash_bits_per_character
en php.ini
. Réglez ce session.hash_bits_per_character = 5
. Alors que ce n'en est pas plus difficile à craquer, il y a une différence lorsque l'attaquant essaie de deviner l'identifiant de session. L'ID sera plus courte, mais utilise plus de caractères.
Définir une entropie supplémentaire avec session.entropy_file
et session.entropy_length
votre php.ini
le fichier. Définir les anciens d' session.entropy_file = /dev/urandom
et le nombre d'octets qui seront lus à partir de l'entropie de fichier, par exemple session.entropy_length = 256
.
Changer le nom de la session à partir de la valeur par défaut PHPSESSID. Ceci est accompli en appelant session_name()
avec votre propre nom de l'identificateur en tant que premier paramètre avant d'appeler, session_start
.
Si vous êtes vraiment paranoïaque, vous pouviez faire tourner le nom de la session, mais méfiez-vous que toutes les séances seront automatiquement invalidé si vous modifiez cette valeur (par exemple, si vous rendre dépendant du temps). Mais, selon votre cas d'utilisation, il peut être une option...
Faites pivoter votre identifiant de session souvent. Je ne ferais pas ça à chaque demande (à moins que vous vraiment besoin de ce niveau de sécurité), mais à un intervalle aléatoire. Vous voulez changer cela souvent, car si l'attaquant n'a détourner une session, vous ne voulez pas être en mesure de l'utiliser trop longtemps.
Inclure l' agent utilisateur à partir d' $_SERVER['HTTP_USER_AGENT']
à la session. En gros, quand la séance commence, de le stocker dans quelque chose comme $_SESSION['user_agent']
. Ensuite, sur chaque demande ultérieure, vérifiez qu'il correspond. Notez que cela peut être faux il n'est donc pas fiable à 100%, mais c'est mieux que pas de.
Inclure l' adresse IP de l'utilisateur à partir d' $_SERVER['REMOTE_ADDR']
à la session. En gros, quand la séance commence, de le stocker dans quelque chose comme $_SESSION['remote_ip']
. Cela peut être problématique à partir de certains fournisseurs d'accès que d'utiliser plusieurs adresses IP pour leurs utilisateurs (tels que AOL). Mais si vous l'utilisez, il sera beaucoup plus sûr. La seule façon pour un attaquant de faux à l'adresse IP est de compromettre le réseau à un moment donné entre le réel de l'utilisateur et de vous. Et si elles risquent de compromettre le réseau, ils peuvent faire bien pire que d'un détournement d'avion (comme les attaques de type MITM, etc).
Inclure un jeton dans la session et sur les navigateurs que vous incrémentation et de comparer les souvent. En gros, pour chaque requête n' $_SESSION['counter']++
sur le côté serveur. Aussi faire quelque chose en JS sur les navigateurs côté à faire de même (à l'aide d'un local de stockage). Ensuite, lorsque vous envoyez une demande, il suffit de prendre un nonce d'un jeton, et vérifier que le nonce est le même sur le serveur. En faisant cela, vous devriez être en mesure de détecter une détourné session étant donné que l'attaquant n'aura pas l'exact contre, ou s'ils le font, vous aurez 2 systèmes de transmission le même chef d'accusation, et vous pouvez dire est forgée. Cela ne fonctionne pas pour toutes les applications, mais est une façon de lutter contre le problème.
Une note sur les deux
La différence entre la Fixation de Session et le Détournement est seulement sur la façon dont l'identifiant de session est compromise. Dans la fixation, l'identificateur est défini sur une valeur que l'attaquant sait avant de la main. Dans le Détournement, c'est soit l'aurez deviné ou de vol de la part de l'utilisateur. Sinon les effets des deux sont les mêmes, une fois l'identifiant est compromise.
ID de Session Régénération
Chaque fois que vous régénérer l'identifiant de session à l'aide de session_regenerate_id
l'ancienne session devrait être supprimé. Ce qui se passe de façon transparente avec le noyau de gestionnaire de session. Cependant, certains les gestionnaires de session personnalisés à l'aide de session_set_save_handler()
ne le faites pas et sont ouverts à l'attaque sur les anciens identifiants de session. Assurez-vous que si vous utilisez un gestionnaire de session personnalisé, que vous garder une trace de l'identifiant que vous ouvrez, et si c'est pas le même que celui que vous enregistrez explicitement supprimer (ou modifier) l'identificateur de l'ancien.
En utilisant le gestionnaire de session par défaut, vous êtes très bien avec tout le qualifiant session_regenerate_id(true)
. Qui va supprimer les anciennes informations de session pour vous. L'ancien ID n'est plus valide et sera la cause d'une nouvelle session est créée si l'attaquant (ou n'importe qui d'autre d'ailleurs) tente de l'utiliser. Soyez prudent avec les gestionnaires de session personnalisés....
La destruction d'une Session
Si vous allez détruire une session (logout par exemple), assurez-vous de détruire de fond en comble. Cela inclut la suppression du cookie. À l'aide de session_destroy
:
function destroySession() {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
session_destroy();
}