web-dev-qa-db-fra.com

Quelles meilleures pratiques doivent être utilisées dans A PHP Login Script?

Je veux ré-écrire mes scripts de connexion pour les sites Web des clients pour les rendre plus sécurisés. Je veux savoir quelles meilleures pratiques je peux mettre en œuvre dans cette situation. Les panneaux de contrôle protégés par mot de passe sont dans leur abondance, mais très peu de gens semblent implémenter les meilleures pratiques en termes d'écriture, de vitesse et de sécurité du code.

Je vais utiliser PHP et une base de données MySQL.

J'avais l'habitude d'utiliser MD5, mais je vois que Sha256 ou SHA512 serait mieux (avec un hachage et du sel sécurisé).

Certains scripts de connexion enregistre l'adresse IP tout au long de la session ou même de l'agent utilisateur, mais je veux éviter cela car il n'est pas compatible avec les serveurs proxy.

Je suis également un peu derrière la meilleure pratique dans l'utilisation de sessions dans PHP 5 (la dernière fois que je lisait était PHP 4) de sorte que certaines meilleures pratiques avec ce serait être utile.

Merci.

27
baritoneuk
  1. Votre site devrait tiliser https. En tout point, vous devez présenter une page de connexion ou accepter des connexions à partir d'une connexion non cryptée.
  2. Vos cookies doivent être limités à http-seulement et être limité à des connexions sécurisées si vous utilisez HTTPS.
  3. Le processus de connexion ne doit pas prendre moins de 2 secondes (1 si vous pensez que 2 secondes est trop longue). tilisez un hachage sécurisé lors de la conservation et de la vérification des mots de passe, et utilisez un sel plus difficile à deviner. Utilisez bcrypt si possible. Sinon, utilisez une autre sorte de hachage itéré.
  4. JAMAIS JAMAIS Composez vos requêtes de base de données de quelque manière que ce soit nécessite d'utiliser des fonctions telles que mysql_real_escape_string. N'utilisez jamais la concaténation de la chaîne pour créer votre requête. Utilisez des requêtes paramétrisées préparées et paramétrées. La plupart, sinon tous, DB pilotes pour PHP le supportez-le. Si vous ne le faites pas ' t savoir comment le faire, passez un peu de temps à apprendre à prepare, bind et execute Utilisation de tout DB que vous utilisez. C'est le seulement Un moyen de vous protéger contre l'injection SQL. PDO soutient cela.
  5. Encouragez vos utilisateurs à non Utilisez le même mot de passe qu'ils utilisent pour leur email. Rappelez-leur que si votre site est compromis et s'il utilise le même mot de passe dans les deux endroits, quelqu'un peut détourner leur email.
6
greyfade
  • N'utilisez jamais d'algorithmes de hachage MD5 ou SHA1. Toujours rester aux plus récents comme Sha512
  • Toujours utiliser un fort sel généré aléatoire
  • N'envoyez jamais vos utilisateurs leurs mots de passe, même en cas de "mot de passe oublié"
  • N'utilisez jamais les fonctions MySQL_ * *. Ils sont longs amortis. Coller à PDO
  • Ne jamais stocker les mots de passe dans des sessions ou des cookies
1
Robin Thomas

Utilisez un hachage à sens unique salé (de préférence SHA512 à l'aide de http://au2.php.net/manual/fr/funcunction.hash.php ) ... de cette façon, si quelqu'un sonne votre base de données , même s'ils connaissent le sel, ils ne peuvent pas extraire les mots de passe (sans table arc-en-ciel, qui serait loong pour SHA512).

Utilisez HTTPS.

N'envoyez pas de confirmations de nom d'utilisateur/mot de passe par courrier électronique à l'utilisateur lors de leur inscription.

Si vous autorisez les cookies pour "Souvenez-vous de moi" - ajoutez un identifiant supplémentaire pour accéder aux fonctions d'administration et d'édition de profil.

Si un utilisateur reçoit un mot de passe mal, ne dites pas qu'ils ont eu le mot de passe (disent qu'ils ont obtenu le "nom d'utilisateur ou mot de passe" à tout moment) - de cette façon, moins d'indices sur les noms d'utilisateur valides.

Essayez de mettre en œuvre le nom de l'écran par rapport à la connexion - de cette façon, moins d'utilisateurs afficheront leur nom de connexion sur les listes d'utilisateurs.

1
HorusKol

Voici un bit de conseil: assurez-vous que vos cookies ne sont pas accessibles avec JS pour empêcher le vol, voir Protéger vos cookies: httponly Article de Jeff Atwood

... à travers une construction intelligente, l'URL mal formée parvient à briser le désinfectant. Le code final rendu, lorsqu'il est visualisé dans le navigateur, charge et exécute un script à partir de ce serveur distant.

... Quiconque chargement de cette page de profil utilisateur injecté par script a involontairement transmis les cookies de leur navigateur à un serveur distant diabolique!

Comme nous l'avons déjà établi, une fois que quelqu'un a vos cookies de navigateur pour un site Web donné, ils ont essentiellement les clés du royaume pour votre identité ...

0
James