Easy-Micro

ESPACEMEMBRE PHP-MySQL
Remplir une table

Remplir la table "clients"

Ajouter des enregistrements

Ajouter des enregistrements dans une table MySQL avec l'extension PDO

Le fichier inscription.php
<h2>Inscription</h2>

<form action="index.php?page=public/clients/traitement_inscription.php" method="post">

Civilité <select name="civilite" style="width:130px;">
<option value="Monsieur">Monsieur</option>
<option value="Madame">Madame</option></select><br><br>
Prénom <input type="text" name="prenom" style="width:130px;"><br><br>
Nom <input type="text" name="nom" style="width:130px;"><br><br>
Email <input type="email" name="email" style="width:130px;"><br><br>
MdP <input type="password" name="mdp" style="width:130px;"><br><br>

<button type="submit">Envoyer</button></form>

Le fichier login.php
<?php
$user = 'root';
$pass = '';
$table = 'clients';

$bdd = new PDO('mysql:dbname=mabase;host=localhost;charset=utf8', $user, $pass);
?>

Le fichier traitement_inscription.php
<?php

require('public/config/login.php');

$civilite = $_POST['civilite'];
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$adresse = '3 bvd gambetta';
$cp = 75022;
$ville = 'Paris';
$email = $_POST['email'];
$mdp = $_POST['mdp'];


$requete = 'INSERT INTO '.$table.'(id_clients, titre_clients, nom_clients, prenom_clients, adresse_clients, cp_clients, ville_clients, email_clients, mdp_clients) VALUES(null,"'.$civilite.'","'.$nom.'","'.$prenom.'","'.$adresse.'","'.$cp.'","'.$ville.'","'.$email.'", SHA1("'.$mdp.'"))';

$resultat = $bdd -> prepare($requete);
$resultat -> execute();

header('Location: index.php?page=public/clients/liste_client.php');
?>
Pour le cryptage du mot de passe, à la place de la fonction SQL SHA1, on aurais pu utiliser la fonction PHP crypt() : crypt($pass, '$2a$12'.md5($pass).'$') - Voir ci-dessous

Note : Le serveur MySQL accepte d'ajouter des enregistrements sans l'instruction Oracle "COMMIT" (et "ROLLBACK" pour supprimer). On dit que par défaut, MySQL est lancé en mode autocommit. Plus d'infos sur dev.MySQL.com


Formation MySQL/MariaDB par Easy-Micro Fonctions de cryptage PHP

Pour une bonne sécurité, il est fortement recommandé d'utilise les fonctions de cryptage PHP. ⚠ chiffrage non réversible. Il n'existe pas de fonction de déchiffrement, car ces fonctions utilisent un algorithme à un seul sens.

Fonction PHP md5()

La fonction PHP md5() est identique à la fonction SQL MD5

$hashed_password = md5($password);
$requete = 'INSERT INTO matable(mdp_clients) VALUES("'.$hashed_password.'")';
Le chiffrement md5() utilise un un grain de sel (salt) de 12 caractères

Fonction PHP sha1()

La fonction PHP sha1() est identique à la fonction SQL SHA1

$hashed_password = sha1($password);
$requete = 'INSERT INTO matable(mdp_clients) VALUES("'.$hashed_password.'")';
⚠ Attention à la structure de votre champ mot_de_passe car une chaine sha1 fait 40 caractères !

Pourquoi les fonctions traditionnelles de hachage comme md5() et sha1() sont-elles inappropriées aux mots de passe ?

Les algorithmes de hachage comme MD5, SHA1 et SHA256 sont destinés à être rapides et efficaces. Avec les équipements informatiques modernes, il est devenu facile d'attaquer par force brute la sortie de ces algorithmes pour retrouver la chaîne originale.

C'est la raison pour laquelle de nombreux experts en sécurité considèrent ces algorithmes comme faibles et les déconseillent fortement pour hacher un mot de passe utilisateur.

Alors, comment hacher mes mots de passe ?

On utilise la fonction PHP crypt(), qui supporte différents algorithmes de hachage depuis PHP 5.3 comme l'algorithme Blowfish ou, encore mieux, la fonction password_hash() qui créée un algorithme aléatoire.

Fonction PHP crypt()

La fonction php crypt() utilise un grain de sel. Un grain de sel, ou "salt", en cryptographie, est appliqué durant le processus de hachage pour éliminer la possibilité d'attaques par dictionnaires

En d'autres termes, un grain de sel est une petite donnée additionnelle qui renforce significativement la puissance du hachage pour le rendre beaucoup plus difficile à cracker.

$hashed_password = crypt($password);
$requete = 'INSERT INTO matable(mdp_clients) VALUES("'.$hashed_password.'")';
Utilisation de la fonction crypt sans son option d'algorithme (salt). Le salt est ici automatiquement généré avec un chiffrement standard DES qui utilise un salt de 2 caractères.

$hashed_password = crypt($password, 'macle');
$requete = 'INSERT INTO matable(mdp_clients) VALUES("'.$hashed_password.'")';
utilisation de la fonction crypt avec son option d'algorithme salt de 5 caractères. Il est recommandé de générer un salt distinct pour chaque mot de passe.

Fonction PHP password_hash()

Idéalement on utilise directement la fonction php password_hash() qui va créer un salt aléatoire si vous n'en fournissez pas, et c'est généralement la façon la plus sécurisée et la plus simple à utiliser.

$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
PASSWORD_DEFAULT peut-être remplacé par PASSWORD_BCRYPT (algorithme Blowfish) ou par PASSWORD_ARGON2I (algorithme Argon2). Mais cette option a été désapprouvée à partir de PHP 7.0.0. Il est donc maintenant préférable d'utiliser simplement le sel qui est généré par défaut. A noter que cette fonction password_hash() est un wrapper (un emballage) de la fonction crypt(). Vous n'avez donc pas besoin d'utiliser crypt()

Formation MySQL/MariaDB par Easy-Micro Vérifier un mot de passe

La fonction PHP password_verify() permet de vérifier qu'un mot de passe correspond à un hachage

<?php
if(password_verify($_POST["password"],$hashed_password))
    echo "Bienvenue";
    else
    echo "Mauvais mot de passe";

// $_POST["password"] ---> Provient du champ du formulaire de connexion
// $hashed_password ---> Provient de la base de donnée

< Page précédente PHP-MYSQL Page suivante >