Mise en place du système de login
Afin de permettre à l'internaute de s'authentifier sur notre site internet, nous avons besoin de mettre en place un formulaire HTML, de créer une table par exemple sous MySql et d'un script PHP pour contrôler l'échange d'information. Le but est d'ouvrir une session sur le serveur Apache pour autoriser l'internaute à consulter des données qui lui sont propres.$pdo = new PDO(...);
$pdo->exec("CREATE TABLE IF NOT EXISTS tb_userlogin (
UL_USERNAME VARCHAR(64) PRIMARY KEY NOT NULL UNIQUE,
UL_PASSWORD VARCHAR(64));");
$_POST['username'] //nom de l'utilisateur issu du formaire
$_POST['pwd'] //mot de passe transmis par le formulaire
//echapper les caractères incorrectes
$username = filter_var($_POST['username'], FILTER_SANITIZE_STRING);
$password = filter_var($_POST['pwd'], FILTER_SANITIZE_STRING);
//tronquer la taille
$username = trim(substr($username, 0, 64));
$password = trim(substr($password, 0, 64));
Stocker les identifiants en clair
En suivant uniquement la logique utilisateur, les mots de passe de chacun sont stockés directement dans la base de donnée. L'avantage est de pouvoir restitué le mot de passe à l'internaute en cas d'oubli de celui-ci.$pdo = new PDO(...);
$sth=$pdo->prepare("INSERT INTO tb_userlogin (UL_USERNAME,UL_PASSWORD)
VALUES (:UL_USERNAME,:UL_PASSWORD)");
$sth->bindParam(':UL_USERNAME',$username , PDO::PARAM_STR, 64);
$sth->bindParam(':UL_PASSWORD', $password, PDO::PARAM_STR, 32);
$sth->execute();
$pdo = new PDO(...);
$sth=$pdo->prepare("SELECT UL_PASSWORD FROM tb_userlogin WHERE UL_USERNAME=:UL_USERNAME");
$sth->bindParam(':UL_USERNAME',$username , PDO::PARAM_STR, 64);
$sth->execute();
$rs=$sth->fetch(PDO::FETCH_ASSOC);
if (isset($rs['UL_PASSWORD']) && $rs['UL_PASSWORD']==$password) {
echo 'Hello '.$username;
@session_start();
} else {
echo 'User or password are wrong ! ';
}
Stocker l'empreinte du mot de passe
L'astuce consiste à convertir le mot de passe en une empreinte. La fonction de hachage transforme un texte en une représentation sous forme de 32 caractères pour le MD5. Ainsi le mot de passe n'apparait plus en clair dans la base de données. Pour corser le tout, on peut ajouter un grain de sel ou salt en anglais lors de la conversion.$salt='grain_de_sel';
$pdo = new PDO('sqlite:' . $file);
$sth=$pdo->prepare("INSERT INTO tb_userlogin (UL_USERNAME,UL_PASSWORD)
VALUES (:UL_USERNAME,:UL_PASSWORD)");
$sth->bindParam(':UL_USERNAME',$username , PDO::PARAM_STR, 64);
$hash_pwd=md5($password.$salt);
$sth->bindParam(':UL_PASSWORD', $hash_pwd, PDO::PARAM_STR, 32);
$sth->execute();
Vérifier les identifiants
$salt='grain_de_sel';
$pdo = new PDO('sqlite:' . $file);
$sth=$pdo->prepare("SELECT UL_PASSWORD FROM tb_userlogin WHERE UL_USERNAME=:UL_USERNAME");
$sth->bindParam(':UL_USERNAME',$username , PDO::PARAM_STR, 64);
$sth->execute();
$rs=$sth->fetch(PDO::FETCH_ASSOC);
$hash_pwd=md5($password.$salt);
if (isset($rs['UL_PASSWORD']) && $rs['UL_PASSWORD']==$hash_pwd) {
echo 'Hello '.$username;
@session_start();
} else {
echo 'User or password are wrong ! ';
}
Utiliser une méthode de chiffrement pour le mot de passe
Sur le principe, le chiffrement du mot de passe est proche de la méthode de l'empreinte vue précédemment. L'avantage du chiffrement avec Blowfish est sa lenteur ! Aucune donnée cryptée n'est inviolable, la question est de savoir combien de temps les ordinateurs mettent pour en trouver la clé. D'où l'intérêt de cette fonction, le chiffrement produit une empreinte solide et assez longue à reproduire.//Générer un nouveau grain de sel pour chaque inscription
$binarySalt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
$salt = substr(strtr(base64_encode($binarySalt), '+', '.'), 0, 22);
$hash = crypt($password, $salt);
//Insérer dans la DB
$pdo = new PDO(...);
$sth = $pdo->prepare("INSERT INTO tb_userlogin (UL_USERNAME,UL_PASSWORD)
VALUES (:UL_USERNAME,:UL_PASSWORD)");
$sth->bindParam(':UL_USERNAME', $username, PDO::PARAM_STR, 64);
$hash_pwd = $hash;
$sth->bindParam(':UL_PASSWORD', $hash_pwd, PDO::PARAM_STR, 32);
$sth->execute();
Vérifier les identifiants
$pdo = new PDO(...);
$sth = $pdo->prepare("SELECT UL_PASSWORD FROM tb_userlogin WHERE UL_USERNAME=:UL_USERNAME");
$sth->bindParam(':UL_USERNAME', $username, PDO::PARAM_STR, 64);
$sth->execute();
$rs = $sth->fetch(PDO::FETCH_ASSOC);
if (isset($rs['UL_PASSWORD']) && crypt($password, $rs['UL_PASSWORD']) === $rs['UL_PASSWORD']) {
echo 'Hello ' . $username;
@session_start();
} else {
echo 'User or password are wrong ! ';
}