2010-11-05 10 views
1

J'ai un site Web de petites annonces que je crée un système de connexion pour ...Nouveau sur les connexions et sessions PHP; Est-ce assez sûr?

Dans le code ci-dessous, un formulaire avec "nom d'utilisateur" et "mot de passe" a été soumis à. Aussi un « remember_me » fonctionnalité est disponible (Code n'est pas testé encore):

else if($row['password']===$pass){ 
    session_start(); 
    $_SESSION['logged_in'] = '1'; 
    $remember_me = isset($_POST['remember']) ? $_POST['remember'] : '0'; 
    if($remember_me=='1'){ 

     $text = "SECRET_TEXT_AND_NUMBERS_HERE"; 
     $username= $row['username']; 

     $salt1 = sha1($row['alt_username']); 
     $salt2 = sha1($text); 

     $cookie_value = $salt1.':'.$username.':'.sha1($row['alt_username'].$salt2.$salt1); 

     setcookie("s_b", $cookie_value, time()+60*60*24*100, "/"); 

    } 

} 

Maintenant, est ce code un bon début pour une page de connexion?

Aussi, une question de suivi importante à tout cela, si les utilisateurs veulent rester connecté, puis-je définir une variable $_SESSION comme celle dans le code, et juste vérifier si cela est défini au début de tous pages sur le site? Ou est-ce que je vérifie si le cookie créé dans la page de connexion est activé au lieu de vérifier la session?

Répondre

2

la connexion concerne la sécurité; la sécurité est toujours plus difficile alors il semble.

Il y a plusieurs choses que vous pourriez améliorer dans votre code. first:

la sécurité de votre mot de passe est dans la force de l'algorithme de hasing. Vous choisissez d'utiliser sha1 (mieux que md5, mais pourrait être amélioré en utilisant SHA256 ou Bcrypt si vous utilisez la version PHP> = 5,3)

Première
Le sel que vous utilisez est censé être une valeur aléatoire, stockée à côté du résultat haché. autrement dit, la valeur à stocker dans votre base de données est:

$salt = [some random string of predifend lenght]; // Let's say 16 characters in length 
$storedValue = $salt . sha256($salt . $password); 

vous vérifiez le mot de passe:

if ($row['username'] == $_POST['username'] && substr($row['$storedValue'], 16) == sha256(substr($row['$storedValue'], 0, 16) . $_POST['password'])) { 
    // login ok 
} else { 
    // login fail 
} 

(mieux encore)
Utiliser une bibliothèque éprouvée pour les trucs de hachage de mot de passe , jetez un coup d'œil à: Portable PHP password hashing framework et essayez d'utiliser l'algorithme CRYPT_BLOWFISH si cela est possible.

Deuxième
Vous ne devez stocker la clé de session dans le cookie de session. toutes les autres informations sont stockées sur le serveur.
Le cookie de session est déjà envoyé par l'appel de fonction session_start() de PHP, vous n'avez donc plus à vous en soucier.

si vous voulez vérifier la durée de vie des sessions, vous devez stocker ces informations dans le tableau de la session:

$_SESSION['lastActivity'] = time()+60*60*24*100; 

Troisième
Le souvenir de moi jeton est un « mot de passe équivalent » vous devriez donc seul magasin un hachage du jeton dans votre base de données, il suffit de le traiter comme un mot de passe, seul ce mot de passe n'est pas saisi par l'utilisateur, mais lu dans le cookie.

+0

Pouvez-vous expliquer « Conserver la clé de session dans le cookie de session » partie shouldn.? –

+1

session_start() définit un cookie contenant une clé de session, vous n'avez pas besoin de définir un autre cookie pour stocker des informations. – Jacco

+0

Oui, durant les sessions, je n'utilise pas de cookies, mais je voulais dire la fonction "Se souvenir de moi". l'utilisateur est-il connecté? Y a-t-il d'autres obstacles que je pourrais ajouter pour est-il encore plus sûr lorsque les utilisateurs passent d'une page à l'autre, au lieu de simplement vérifier si une «variable de session est vraie ou fausse»? –

1

Tout le point d'un hachage est qu'il n'est pas réversible, donc il n'ajoute pas vraiment de valeur comme vous l'avez utilisé pour la fonction remember me.Arrêtez de faire semblant de faire quelque chose d'utile, et utilisez un jeton aléatoire pour le souvenir de moi (et consignez-le dans la base de données par rapport au nom d'utilisateur) puis, si vous recevez un cookie souvenir sans une session authentifiée, découvrez qui c'est.

(cela permet également d'appliquer une approche sensée lorsque l'utilisateur continue de se déplacer vers différentes machines - vous pouvez dire conserver les 2 dernières valeurs - et de signaler quand il essaie de se souvenir d'une 3ème machine).

Un délai d'attente de 100 jours est assez longue - peut-être 30 jours (avec une actualisation automatique pourrait être plus approprié en fonction du niveau de risque