Système d'enregistrement sécurisé avec PHP et MySQL
Ce didacticiel fait suite à notre précédent didacticiel Système de connexion sécurisée avec PHP et MySQL . Dans ce didacticiel, nous allons créer un formulaire d'inscription sécurisé et implémenter une validation de base.
Un formulaire d'inscription est ce que les visiteurs de votre site Web peuvent utiliser pour enregistrer leurs coordonnées, qui seront ensuite stockées dans une base de données MySQL.
1. Mise en route
Nous devons suivre quelques étapes avant de créer notre système d'inscription sécurisé. Nous devons configurer notre environnement de serveur Web et nous assurer que les extensions requises sont activées (ignorer si vous avez suivi le didacticiel du système de connexion sécurisée) .
1.1. Exigences
- Si vous n'avez pas configuré de serveur Web local, vous devrez télécharger et installer XAMPP . XAMPP est un environnement de développement Web côté serveur qui comprend l'essentiel pour les développeurs Web back-end.
1.2. Ce que vous apprendrez dans ce tutoriel
- Conception de formulaire — Concevez un formulaire d'inscription avec HTML5 et CSS3.
- Requêtes SQL préparées — Comment préparer les requêtes SQL pour empêcher l'injection SQL et insérer de nouveaux enregistrements dans une base de données MySQL.
- Validation de base — Validation des données de formulaire envoyées au serveur (nom d'utilisateur, mot de passe et e-mail).
1.3. Structure et configuration des fichiers
Nous devons maintenant démarrer notre serveur Web et créer les fichiers et répertoires que nous allons utiliser pour notre système d'enregistrement.
- Ouvrez le panneau de configuration XAMPP
- À côté du module Apache, cliquez sur Démarrer
- À côté du module MySQL, cliquez sur Démarrer
- Accédez au dossier d'installation de XAMPP ( C:\xampp )
- Ouvrez le dossier htdocs
- Créez les dossiers et fichiers suivants :
Chaque fichier contiendra les éléments suivants :
- register.html — Formulaire d'inscription créé avec HTML5 et CSS3. Comme ce fichier ne nous oblige pas à utiliser PHP, nous l'enregistrerons en HTML brut.
- style.css — La feuille de style (CSS3) pour notre formulaire d'inscription sécurisé.
- register.php — Valide les données du formulaire et insère un nouveau compte dans la base de données MySQL.
- activate.php — Activez le compte de l'utilisateur avec un code unique (activation par e-mail).
2. Création de la conception du formulaire d'inscription
Le formulaire d'inscription sera utilisé par les visiteurs de nos sites Web. Ils peuvent l'utiliser pour saisir les informations de leur compte. Nous allons créer le formulaire d'inscription avec HTML et CSS.
Modifiez le fichier register.html et ajoutez le code suivant :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Register</title>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css">
</head>
<body>
<div class="register">
<h1>Register</h1>
<form action="register.php" method="post" autocomplete="off">
<label for="username">
<i class="fas fa-user"></i>
</label>
<input type="text" name="username" placeholder="Username" id="username" required>
<label for="password">
<i class="fas fa-lock"></i>
</label>
<input type="password" name="password" placeholder="Password" id="password" required>
<label for="email">
<i class="fas fa-envelope"></i>
</label>
<input type="email" name="email" placeholder="Email" id="email" required>
<input type="submit" value="Register">
</form>
</div>
</body>
</html>
Accédez à http://localhost/phplogin/register.html , notre formulaire d'inscription ressemblera à ceci :
Assez basique pour un formulaire d'inscription, ajoutons maintenant du CSS, éditons le fichier style.css et ajoutons ce qui suit :
* {
box-sizing: border-box;
font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen, ubuntu, cantarell, "fira sans", "droid sans", "helvetica neue", Arial, sans-serif;
font-size: 16px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
background-color: #435165;
margin: 0;
}
.register {
width: 400px;
background-color: #ffffff;
box-shadow: 0 0 9px 0 rgba(0, 0, 0, 0.3);
margin: 100px auto;
}
.register h1 {
text-align: center;
color: #5b6574;
font-size: 24px;
padding: 20px 0 20px 0;
border-bottom: 1px solid #dee0e4;
}
.register form {
display: flex;
flex-wrap: wrap;
justify-content: center;
padding-top: 20px;
}
.register form label {
display: flex;
justify-content: center;
align-items: center;
width: 50px;
height: 50px;
background-color: #3274d6;
color: #ffffff;
}
.register form input[type="password"], .register form input[type="text"], .register form input[type="email"] {
width: 310px;
height: 50px;
border: 1px solid #dee0e4;
margin-bottom: 20px;
padding: 0 15px;
}
.register form input[type="submit"] {
width: 100%;
padding: 15px;
margin-top: 20px;
background-color: #3274d6;
border: 0;
cursor: pointer;
font-weight: bold;
color: #ffffff;
transition: background-color 0.2s;
}
.register form input[type="submit"]:hover {
background-color: #2868c7;
transition: background-color 0.2s;
}
Nous devons inclure notre feuille de style dans notre fichier register.html , copier et coller le code suivant dans la section head :
<link href="style.css" rel="stylesheet" type="text/css">
Et maintenant, notre formulaire d'inscription sera plus attrayant :
Affinons le formulaire afin que nous puissions mieux comprendre ce qui se passe.
- Formulaire - nous devons utiliser à la fois leactionetPostattributs, lesactionsera défini sur le fichier d'enregistrement. Lorsque le formulaire est soumis, les données du formulaire seront envoyées au fichier d'inscription pour traitement. lemethodeest depost, cela nous permettra de traiter les données du formulaire.
- Entrée (texte/mot de passe/e-mail) — Nous devons nommer nos champs de formulaire afin que le serveur puisse les reconnaître, donc si nous définissons la valeur de l'attributnameà lausername, nous pouvons utiliser la variable post dans notre fichier d'enregistrement pour obtenir les données, comme ceci :$_POST['username'].
- Entrée (soumettre) — Au clic, les données du formulaire seront envoyées à notre fichier d'inscription.
C'est essentiellement tout ce que nous devons faire côté client, la prochaine étape consiste à configurer la base de données et à créer le fichier d'enregistrement avec PHP.
3. Création de la base de données et configuration des tables
Pour cette partie, vous devrez accéder à votre base de données MySQL, soit en utilisant phpMyAdmin , soit votre application de gestion de base de données MySQL préférée.
Si vous utilisez phpMyAdmin , suivez ces instructions :
- Accédez à : http://localhost/phpmyadmin/
- Cliquez sur l' onglet Bases de données en haut
- Sous Créer une base de données , tapez phplogin dans la zone de texte
- Sélectionnez utf8_general_ci comme classement
- Cliquez sur Créer
Vous pouvez utiliser votre propre nom de base de données, mais pour ce tutoriel, nous utiliserons phplogin .
Ce dont nous avons besoin maintenant, c'est d'une table de comptes qui stockera tous nos comptes (noms d'utilisateur, mots de passe, e-mails, etc.).
Cliquez sur la base de données dans le panneau de gauche ( phplogin ) et exécutez l'instruction SQL suivante :
CREATE TABLE IF NOT EXISTS `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Sur phpMyAdmin , cela devrait ressembler à :
Le code d'instruction SQL ci-dessus créera la table des comptes avec les colonnesid,username,password, etemail.
4. Enregistrement d'utilisateurs avec PHP et MySQL
Nous devons maintenant créer le fichier d'inscription qui traitera les champs du formulaire, vérifier la validation de base et insérer le nouveau compte dans notre base de données.
La page d'inscription nécessitera une connexion à notre base de données et nous devons donc inclure les variables et les fonctions MySQL nécessaires. Modifiez le fichier register.php et ajoutez le code suivant :
<?php
// Change this to your connection info.
$DATABASE_HOST = 'localhost';
$DATABASE_USER = 'root';
$DATABASE_PASS = '';
$DATABASE_NAME = 'phplogin';
// Try and connect using the info above.
$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if (mysqli_connect_errno()) {
// If there is an error with the connection, stop the script and display the error.
exit('Failed to connect to MySQL: ' . mysqli_connect_error());
}
N'oubliez pas de mettre à jour les variables MySQL si vos informations d'identification MySQL ne reflètent pas les valeurs déclarées.
Ensuite, nous pouvons ajouter une validation de base pour nous assurer que l'utilisateur a saisi ses coordonnées et vérifier les variables vides.
// Now we check if the data was submitted, isset() function will check if the data exists.
if (!isset($_POST['username'], $_POST['password'], $_POST['email'])) {
// Could not get the data that should have been sent.
exit('Please complete the registration form!');
}
// Make sure the submitted registration values are not empty.
if (empty($_POST['username']) || empty($_POST['password']) || empty($_POST['email'])) {
// One or more values are empty.
exit('Please complete the registration form');
}
Nous devons maintenant vérifier si le compte existe déjà dans la base de données. Nous pouvons vérifier cela en sélectionnant un enregistrement de notre table de comptes avec le mêmeusernameque l'utilisateur a fourni.
Ajouter après :
// We need to check if the account with that username exists.
if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ?')) {
// Bind parameters (s = string, i = int, b = blob, etc), hash the password using the PHP password_hash function.
$stmt->bind_param('s', $_POST['username']);
$stmt->execute();
$stmt->store_result();
// Store the result so we can check if the account exists in the database.
if ($stmt->num_rows > 0) {
// Username already exists
echo 'Username exists, please choose another!';
} else {
// Insert new account
}
$stmt->close();
} else {
// Something is wrong with the sql statement, check to make sure accounts table exists with all 3 fields.
echo 'Could not prepare statement!';
}
$con->close();
?>
Remplacer:
// Insert new account
Avec:
// Username doesnt exists, insert new account
if ($stmt = $con->prepare('INSERT INTO accounts (username, password, email) VALUES (?, ?, ?)')) {
// We do not want to expose passwords in our database, so hash the password and use password_verify when a user logs in.
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$stmt->bind_param('sss', $_POST['username'], $password, $_POST['email']);
$stmt->execute();
echo 'You have successfully registered, you can now login!';
} else {
// Something is wrong with the sql statement, check to make sure accounts table exists with all 3 fields.
echo 'Could not prepare statement!';
}
Cela va insérer un nouveau compte dans notre table de comptes.
N'oubliez pas que dans notre système de connexion, nous avons utilisé lepassword_verifyune fonction? Comme vous pouvez le voir dans le code ci-dessus, nous utilisons lepassword_hashfonction, cela cryptera le mot de passe de l'utilisateur à l'aide de l'algorithme à sens unique - cela empêchera les mots de passe de vos utilisateurs d'être exposés si, pour une raison quelconque, votre base de données devient vulnérable.
C'est essentiellement tout ce que nous devons faire pour enregistrer des comptes sur notre site Web.
5. Validation des données du formulaire
Nous avons déjà une validation de base dans notre script PHP, mais que se passe-t-il si nous voulons vérifier si l'e-mail est réellement un e-mail ou si le nom d'utilisateur et le mot de passe doivent contenir un certain nombre de caractères, vous pouvez le faire avec les codes ci-dessous, ajoutez-les dans laregister.phpfichier avant la ligne suivante :
if ($stmt = $con->prepare('SELECT id, password FROM accounts WHERE username = ?')) {
Validation par e-mail
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
exit('Email is not valid!');
}
Validation des caractères invalides
if (preg_match('/^[a-zA-Z0-9]+$/', $_POST['username']) == 0) {
exit('Username is not valid!');
}
Vérification de la longueur des caractères
if (strlen($_POST['password']) > 20 || strlen($_POST['password']) < 5) {
exit('Password must be between 5 and 20 characters long!');
}
Vous devez toujours implémenter votre propre validation, ce ne sont que des exemples de base.
6. Mise en œuvre de l'activation de compte
Le système d'activation de compte enverra un e-mail à l'utilisateur avec le lien d'activation lorsque l'utilisateur s'est enregistré.
La première chose que nous devons faire est d'aller dans phpMyAdmin et de sélectionner notre base de données, dans notre cas ce serait phplogin , vous pouvez soit ajouter la colonneactivation_codeà la table des comptes ou exécutez l'instruction SQL ci-dessous.
ALTER TABLE accounts ADD activation_code varchar(50) DEFAULT ''
Nous devons maintenant éditer notre fichier register.php , recherchez cette ligne de code :
if ($stmt = $con->prepare('INSERT INTO accounts (username, password, email) VALUES (?, ?, ?)')) {
Remplacer par:
if ($stmt = $con->prepare('INSERT INTO accounts (username, password, email, activation_code) VALUES (?, ?, ?, ?)')) {
Rechercher:
$stmt->bind_param('sss', $_POST['username'], $password, $_POST['email']);
Remplacer par:
$uniqid = uniqid();
$stmt->bind_param('ssss', $_POST['username'], $password, $_POST['email'], $uniqid);
le$uniqudgénérera un identifiant unique que nous utiliserons pour notre code d'activation, celui-ci sera envoyé à l'adresse e-mail de l'utilisateur.
Rechercher:
echo 'You have successfully registered, you can now login!';
Remplacer par:
$from = 'noreply@yourdomain.com';
$subject = 'Account Activation Required';
$headers = 'From: ' . $from . "\r\n" . 'Reply-To: ' . $from . "\r\n" . 'X-Mailer: PHP/' . phpversion() . "\r\n" . 'MIME-Version: 1.0' . "\r\n" . 'Content-Type: text/html; charset=UTF-8' . "\r\n";
// Update the activation variable below
$activate_link = 'http://yourdomain.com/phplogin/activate.php?email=' . $_POST['email'] . '&code=' . $uniqid;
$message = '<p>Please click the following link to activate your account: <a href="' . $activate_link . '">' . $activate_link . '</a></p>';
mail($_POST['email'], $subject, $message, $headers);
echo 'Please check your email to activate your account!';
Lors de l'enregistrement du compte, l'utilisateur devra activer son compte en utilisant le lien d'activation qui est envoyé à son adresse e-mail. Vous devez mettre à jour à la fois le$fromet$activate_linkvariables.
Nous pouvons maintenant procéder à la création du fichier d'activation. Le fichier d'activation traitera les paramètres GET et vérifiera l'e-mail et le code. Le compte de l'utilisateur sera activé si le code est valide.
Modifiez/créez le fichier activate.php et ajoutez le code suivant :
<?php
// Change this to your connection info.
$DATABASE_HOST = 'localhost';
$DATABASE_USER = 'root';
$DATABASE_PASS = '';
$DATABASE_NAME = 'phplogin';
// Try and connect using the info above.
$con = mysqli_connect($DATABASE_HOST, $DATABASE_USER, $DATABASE_PASS, $DATABASE_NAME);
if (mysqli_connect_errno()) {
// If there is an error with the connection, stop the script and display the error.
exit('Failed to connect to MySQL: ' . mysqli_connect_error());
}
// First we check if the email and code exists...
if (isset($_GET['email'], $_GET['code'])) {
if ($stmt = $con->prepare('SELECT * FROM accounts WHERE email = ? AND activation_code = ?')) {
$stmt->bind_param('ss', $_GET['email'], $_GET['code']);
$stmt->execute();
// Store the result so we can check if the account exists in the database.
$stmt->store_result();
if ($stmt->num_rows > 0) {
// Account exists with the requested email and code.
if ($stmt = $con->prepare('UPDATE accounts SET activation_code = ? WHERE email = ? AND activation_code = ?')) {
// Set the new activation code to 'activated', this is how we can check if the user has activated their account.
$newcode = 'activated';
$stmt->bind_param('sss', $newcode, $_GET['email'], $_GET['code']);
$stmt->execute();
echo 'Your account is now activated! You can now <a href="index.html">login</a>!';
}
} else {
echo 'The account is already activated or doesn\'t exist!';
}
}
}
?>
Si le code reflète celui de la base de données qui est associé au compte de l'utilisateur, la valeur duactivation_codela colonne sera mise à jour pouractivated.
Si nous voulons vérifier si l'utilisateur a activé son compte, nous pouvons ajouter le code suivant aux pages que nous voulons restreindre les utilisateurs non activés :
if ($account['activation_code'] == 'activated') {
// account is activated
// Display home page etc
} else {
// account is not activated
// redirect user or display an error
}
Pour que le code ci-dessus fonctionne, vous devrez vous connecter à votre base de données MySQL et sélectionner le compte de l'utilisateur.
Notez également que la fonction de messagerie PHP ne fonctionnera que si votre ordinateur ou votre serveur la prend en charge. S'il n'envoie pas d'e-mail, vérifiez votre configuration ou installez un serveur de messagerie tel que Postfix .
Conclusion
Toutes nos félicitations! Vous avez créé avec succès un système de connexion (si vous avez suivi le tutoriel précédent) et un système d'enregistrement avec PHP et MySQL. Vous êtes libre d'utiliser le code de ce tutoriel et de l'adapter à vos propres projets.
N'oubliez pas qu'il ne s'agit que d'une base sécurisée à partir de laquelle vous devez travailler. Envisagez de modifier ou d'implémenter votre propre validation, et implémentez vos propres fonctionnalités.
Si vous souhaitez plus de cette série de tutoriels, n'hésitez pas à laisser un commentaire et à nous suggérer ce que nous pourrions créer ensuite.
Profitez du codage !
merci pour ce tutoriel grâce à vous je parviens à comprendre comment créer une base de donnée avec php et sql
ReplyDeletede rien
Delete