web-dev-qa-db-fra.com

Création de sessions sécurisées PHP

J'ai déjà créé et perfectionné des systèmes d'enregistrement et de connexion, mais je suis porté à croire que la partie délicate survient lorsque vous créez une session. Pour autant que je sache, cela est dû à la fois au détournement et à la fixation. En toute honnêteté, je ne comprends pas bien le concept.

J'ai navigué sur Internet toute la journée et effectué de nombreuses recherches. Les articles suivants m'ont été utiles jusqu'à présent:

Comment créer des sessions pare-balles

Guide de sécurité PHP: Sessions

Jusqu'à présent, j'ai très peu, je pourrais vraiment utiliser de l'aide et des conseils. Voici une partie de ce que j'ai obtenu jusqu'à présent:

Lorsqu'un mot de passe utilisateur est mis en correspondance et qu'il a confirmé son identité à l'aide du script de connexion, la fonction suivante est appelée. La session démarre en haut du script de connexion.

function begin_session()
{
session_regenerate_id();
$_SESSION['valid'] = 1;
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);
} 

J'utilise la variable $ _SESSION ['valide'] comme simple confirmation de connexion de l'utilisateur. J'attribue la session à un seul agent utilisateur et une seule adresse IP. Je vois à quel point l'agent utilisateur est assez inutile car il peut être facilement falsifié, mais je pense qu'il vaut mieux l'avoir plutôt que de ne pas l'avoir.

Il est évident pour moi que les utilisateurs avec des IP changeantes/dynamiques seraient déconnectés ... mais tous ceux qui m'ont dit cela n'ont pas réussi à me proposer une meilleure option, ou à me l'expliquer mieux.

J'utilise ensuite la fonction suivante pour faire correspondre l'agent utilisateur actuel à l'agent utilisateur d'origine enregistré lors de la création de la session.

    function authenticate()
{
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
echo 'die';
    header('Location: http://website login page/');
    exit();     
}
}

Pour le moment, en raison de mon manque de compréhension, je ne sais pas d'où je suis vulnérable et où je peux aller et apporter des améliorations. Tout cela est très nouveau pour moi et en ce moment au moins j'essaie d'apprendre cela pendant mon temps libre. Tout cela est nouveau pour moi et je veux assurer le meilleur travail.

18
TuKritical

Tout d'abord, ARRÊTEZ D'UTILISER MD5! C'est une fonction de hachage cassée, et elle est cassée depuis de nombreuses années. Vous devez également utiliser un hmac, appeler directement md5 est vulnérable à une attaque d'extension de longueur.

Le test de l'adresse IP est problématique car cette valeur peut changer si l'utilisateur se trouve derrière un équilibreur de charge, qui est couramment utilisé par les univers et les bureaux d'entreprise.

L'attaquant aura toujours l'agent utilisateur, et cette valeur est très facile à forcer brutalement. Tester cette valeur n'est en aucun cas une forme ou une "mesure de sécurité". C'est un peu comme avoir une variable is_attacker=no et en m'assurant que cette valeur est "non", ce qui est UNE JOKE! Quand je vois un programmeur faire ça, je sens le sang, s'il pense vraiment cela contribue à améliorer la sécurité, puis ils ont probablement commis d'autres erreurs.

Définissez vos configurations de session php comme suit:

session.cookie_httponly = 1 (helps mitigate xss)
session.session.use_only_cookies = 1 (prevents session fixation)
session.entropy_file = "/dev/urandom" (better entropy source)
session.cookie_lifetime = 0  (smaller exploitation window for xss/csrf/clickjacking...)
session.cookie_secure = 1 (owasp a9 violations)
15
rook

Ce n'est peut-être qu'une opinion personnelle ...

Je voudrais stocker les informations de session dans une base de données et les référencer par un jeton stocké dans un cookie. vous n'avez plus besoin de la variable "valide" car la base de données ferait référence croisée au jeton et s'assurerait qu'il est toujours dans la durée de vie autorisée.

Vous pouvez choisir de travailler directement avec le cookie ou d'utiliser le cookie pour définir les informations de session si vous le souhaitez. La session n'est pas vraiment nécessaire. Plus c'est simple, mieux c'est.

Votre jeton peut être généré lorsque l'utilisateur se connecte et, si vous le souhaitez, régénéré sur n'importe quel chargement de page - si vous souhaitez le garder cyclique.

l'agent utilisateur et l'adresse distante ne sont pas une bonne base pour un jeton car ils peuvent être très courants pour de nombreuses personnes. Pensez comme un proxy pour un collège ou quelque chose. Tout le monde aura la même IP. vous pouvez créer n'importe quelle chaîne aléatoire et cela suffira tant qu'elle est unique.

Quoi que vous choisissiez de faire, l'idée de base est de limiter autant que possible le nombre d'informations dans votre session ou les cookies. Il serait difficile de deviner un jeton valide si vous définissez l'expiration sur une heure normale. De plus, vous pouvez suivre les tentatives infructueuses et bloquer les tentatives qui s'accumulent sur une courte période.

Vous pouvez également démarrer des personnes si un compte essaie de se connecter à partir de plusieurs emplacements. Dans ce cas, l'agent utilisateur et l'adresse IP peuvent aider à identifier les tentatives d'accès simultanées.

2
Kai Qing

Je suis actuellement dans une position similaire, en regardant toutes les différentes options et répercussions de la sécurité des sessions et c'est tout un défi d'équilibrer la convivialité et la sécurité avec une faiblesse potentielle sur le serveur, dans le transport et sur le client. SSL est le meilleur moyen de protéger la couche de transport et un paramètre sécurisé de cookies aide à la protection du client.

En termes d'utilisation de l'adresse distante $ Server, il y a des problèmes. Pour certains utilisateurs, cette valeur change assez régulièrement et un utilisateur devant ressaisir son mot de passe à chaque fois devient ennuyeux. Pour les autres utilisateurs qui se trouvent sur une adresse IP fixe ou une plage d'adresses IP, cela peut aider à rendre la connexion plus difficile, surtout si SSL est également utilisé. L'IP à distance n'est pas une solution miracle en termes de sécurité, mais rien n'est dans le cyberespace. La combinaison de plusieurs méthodes de sécurité est utile. Essayer de créer un profil utilisateur avec lequel les variables $ server restent constantes et quel changement peut aider à savoir quand se déconnecter de l'utilisateur et demander le mot de passe de manière plus rapide et conviviale. Si l'utilisateur est déconnecté, toute tentative de force brute sur les autres variables du serveur $ comme l'agent utilisateur ou le codage de langue devra simplement attendre que le véritable utilisateur se reconnecte.

Comment vous gérez plusieurs sources de connexion a également ses problèmes, que se passe-t-il si l'utilisateur souhaite se connecter depuis son travail, à la maison ou lors de ses déplacements? En ayant des informations sur la façon dont l'utilisateur utilise son compte dans les premiers jours, il peut être utile de savoir quand fermer la session et demander à nouveau le mot de passe plus tard. En tant qu'administrateurs et même avec une cybersécurité parfaite, la façon dont les utilisateurs gèrent leurs mots de passe continuera d'être un problème et nécessitera une certaine facilité pour nettoyer et nettoyer le gâchis quand cela se produit.

0
Kevin Martin