web-dev-qa-db-fra.com

Quelle est la manière correcte et sûre / sécurisée de garder un utilisateur connecté? biscuits? session? PHP && MYSQL

Plus tard, je demandais comment déconnecter correctement un utilisateur, maintenant je vois que l'utilisation de cookies uniquement pour garder un utilisateur connecté n'est pas du tout sécurisée.

Conserver le mot de passe dans un cookie n'est pas une méthode sécurisée pour le faire, donc ma question est, quelle est la bonne façon de faire (se connecter/garder l'utilisateur connecté) sur mon site Web?

Actuellement, je stocke l'ID utilisateur qui est le même que l'URL a besoin pour afficher le profil utilisateur X, et l'e-mail et le mot de passe cryptés dans MD5.

Setcookie est la seule fonction que j'utilise lors d'une connexion réussie. J'utilise uniquement des sessions pour stocker des nombres aléatoires afin d'éviter les soumissions répétitives de formulaires. champs cachés.

• Pouvez-vous me montrer comment est la manière correcte et sécurisée de le faire?
• Quelle est votre façon de procéder?

PHP uniquement. Deux mois en php, tous ont appris de vos réponses. Merci

25
Bona Chon

Tout d'abord, laissez-moi vous dire ceci. Rien n'est sûr à 100%. Rien n'est étanche à l'air et rien n'est sacré. S'il est suffisamment motivé, un attaquant brisera toutes les défenses côté serveur que vous pourriez mettre (sauf si vous utilisez HTTPS, ce qui est une autre histoire).

Vous pouvez utiliser des cookies, mais les cookies sont très exposés et facilement modifiables. Ne stockez jamais de données privées ou de niveaux d'accès dans un cookie. Comme il est facilement volé/modifié par un attaquant.

Les sessions ne sont pas sécurisées à 100% non plus. L'ID de session, que le serveur utilise pour identifier le client, est envoyé par l'une des 2 façons. une variable $ _GET (mauvaise), ou un cookie (mieux, mais toujours assez mauvais). Autrement dit, si vous êtes connecté en tant qu'administrateur, via un WiFi non sécurisé, un attaquant qualifié (et par qualifié je veux dire un pr0 haxx0r qui a téléchargé un simple sniffer HTTP) peut facilement voler votre ID de SESSION. Et sans obtenir votre mot de passe, le serveur identifiera à tort l'attaquant comme vous et lui accordera tout accès que vous pourriez avoir/eu.

Alors que faire? Les séances sont dans la plupart des cas sûres. Conseillez à vos utilisateurs de ne pas se connecter sous un réseau non sécurisé (bus, cybercafés, etc.). Si vous souhaitez que votre autorisation d'utilisateur persiste dans le temps, un cookie est requis. J'utilise généralement un système à 2 cookies si j'en ai besoin:

userid=12345
hash=password_hash($userid . $hashed_password, PASSWORD_DEFAULT)

Ensuite, j'ai quelque chose à comparer, et les détails de l'utilisateur n'ont pas été révélés.


Mais comme je l'ai dit, à la fin de la journée, si vous vouliez vraiment vraiment sécuriser vos utilisateurs, en haut de tout ce qui est écrit dans cette réponse, procurez-vous HTTPS.

37
Madara's Ghost

J'utiliserais une session.

Pour aider un peu la sécurité, une fois les informations d'identification des utilisateurs vérifiées, utilisez session_regenerate_id - puisque l'ID de session est ce qui est transmis dans un cookie, cela est important si quelqu'un renifle pendant que la connexion est traitée.

NE CONSERVEZ AUCUNE information dans la session concernant les informations d'identification d'accès - un ID utilisateur est souvent suffisant; personnellement, je construis un objet utilisateur que je stocke dans la session (ceux-ci sont automatiquement sérialisés/non sérialisés entre les requêtes - mais vous pouvez les lire indépendamment).

SI vous souhaitez définir un cookie afin que l'utilisateur n'ait pas à se connecter lors de la prochaine visite, peut-être stocker l'ID utilisateur et un jeton généré automatiquement qui peuvent être vérifiés dans la base de données (ou similaire) - j'ajouterais également des extras à la vérification - comme stocker la dernière adresse IP avec le jeton à vérifier également, si elles ne correspondent pas, demandez une nouvelle fois la connexion.

Il existe un certain nombre d'approches qui peuvent être adoptées - je n'offre pas tout/`` le meilleur '' - faites réviser votre code par des personnes dans une communauté php - vous en apprendrez plus de cette façon.

9
Ian Wood

Si une personne dispose d'un identifiant et d'un mot de passe, celui-ci peut être défini comme un cookie dans son navigateur afin de ne pas avoir à se reconnecter à votre site Web à chaque visite. Vous pouvez stocker presque tout dans un cookie de navigateur. Le problème est qu'un utilisateur peut bloquer les cookies ou les supprimer à tout moment. Si, par exemple, le panier de votre site Web utilise des cookies et qu'une personne a configuré son navigateur pour les bloquer, alors elle ne peut pas acheter sur votre site Web.

Lorsque vous stockez des données dans des cookies, vous devez être absolument certain que les utilisateurs ne peuvent en aucun cas altérer les données. Il n'y a aucun moyen d'empêcher les utilisateurs de modifier les données d'un cookie; c'est absurdement facile. Ainsi, afin de vous assurer que votre site Web n'accepte pas les cookies contenant des données modifiées, vous devez soit crypter les valeurs des cookies, soit les signer avec un hachage qui vous permet de vérifier leur intégrité.

5
Moyed Ansari

La meilleure pratique consiste à utiliser PHP sessions.

Une chaîne PHP session est maintenue en faisant en sorte que le navigateur retourne une chaîne cryptographiquement sécurisée (c'est-à-dire, impossible à deviner quant à la prochaine valeur valide) appelée chaîne ID de session chaque fois qu'il fait une demande au cours de cette session. Le moyen le plus sûr et le plus sûr de le faire est de donner au navigateur un cookie de session, qu'il enverra ensuite à chaque demande.

La méthode alternative à l'utilisation d'un cookie de session consiste à inclure l'ID de session PHP dans l'URL de la demande elle-même en tant que variable GET. Un exemple d'URL pourrait ressembler à quelque chose comme :

https://www.example.com/mypage.php?PHPSESSID=cteekbf64igp5vdjjkktvoeb97

Ce n'est pas aussi sûr que d'utiliser un cookie, car l'URL peut accidentellement être partagée ou volée par d'autres moyens.

La sécurité est en plusieurs couches, comme un oignon (comme l'exemple commun va). Plus vous sécurisez quelque chose, plus il faut d'efforts pour le sécuriser et moins il est pratique à utiliser. C'est un compromis coût-avantage. Vous devez donc vous demander quelle est l'importance de vos données, la confidentialité et la sécurité de vos utilisateurs, etc.

Pour moi, un niveau de base serait d'utiliser PHP sessions avec l'ID de session forcé d'être dans les cookies (bloquer les utilisateurs qui désactivent les cookies), le cryptage SSL tout le temps, à la fois sur les données et les cookies et assurez-vous que les divers paramètres PHP qui affectent la sécurité des sessions sont définis sur les paramètres les meilleurs et les plus sécurisés. Vous voudrez tout lire sur ces pages et les pages enfants:

3
CXJ

Comme @Madara l'a dit, rien n'est sûr et correct à 100%, mais en tant que point de vue développeur, je dirais que chaque méthode de conservation des données de session de l'utilisateur a ses propres avantages et inconvénients, par exemple.

Données utilisateur dans les cookies vs session

Si vous conservez les données de session de l'utilisateur dans des cookies, cela consommera moins de mémoire RAM mémoire et traitement car vous n'avez pas à conserver les informations de l'utilisateur connecté dans la RAM. Également si l'utilisateur augmente, il est recommandé de le conserver) les données de session de l'utilisateur dans les cookies plutôt que dans la session, car le maintien de la session consommerait des ressources de serveur et votre application pourrait être plus lente et non réactive parfois. les ressources du serveur.

Sur la note finale: Les deux méthodes sont correctes dans sa propre implémentation également si votre application utilise le protocole HTTPS, la sécurité ne devrait pas être un problème. Je suggère donc d'utiliser des méthodes de conservation des données de session de l'utilisateur en fonction des exigences de l'application et du modèle commercial.

2
Deepak