Exemple de création d'un script d'authentification

Script d'authentification

Introduction

Depuis le peu de temps que je traine sur PhpCs, j'ai vu beaucoup de demande d'aide pour les scripts d'authentification. Nous allons donc dans ce petit tutoriel dédié aux débutants voir comment crée un script d'authentification avec un minimum de sécurité.

Avant-propos

On suppose que vous connaissez les méthodes de transmission de données par formulaire.

Pour plus de visibilité, on utilisera la méthode GET.

On travaillera hors cryptage de mot de passe et récupération par mail.

Le but étant de comprendre un mécanisme d'authentification simple, on se contentera de limiter le nombre de tentative d'accès à un compte utilisateur.

Création de la table

Pour les besoins du tutoriel nous allons crée une table avec 6 champs :

CREATE TABLE IF NOT EXISTS 'table_utilisateur' (

'id'int(3) NOT NULL AUTO_INCREMENT,

'user'varchar(20) COLLATE latin1_general_ci NOT NULL,

'pass'varchar(40) COLLATE latin1_general_ci NOT NULL,

'nbr_connect' tinyint(1) NOT NULL DEFAULT '0',

'dates'datetime NOT NULL,

PRIMARY KEY ('id'),

UNIQUE KEY 'user' ('user'));

config.php

Nous allons créer un fichier config.php, qui contiendra les informations nécessaires pour la connexion à notre base de données :

<?php
$DB_serveur = ''; // Nom du serveur
$DB_utilisateur = ''; // Nom de l'utilisateur de la base
$DB_motdepasse = ''; // Mot de passe pour accèder à la base
$DB_base = ''; // Nom de la base

$connection = mysql_connect($DB_serveur, $DB_utilisateur, $DB_motdepasse) // On se connecte au serveur
or die (mysql_error().' sur la ligne '.__LINE__);

mysql_select_db($DB_base, $connection) // On se connecte à la BDD
or die (mysql_error().' sur la ligne '.__LINE__);
?>

index.php

Ce fichier contiendra le formulaire qui nous permettra d'accéder à notre compte utilisateur :

<form method="get" action="connect.php">
<fieldset><legend>Login : </legend><input type="text" name="login"/></fieldset>
<fieldset><legend>Mot de passe : </legend><input type="password" name="motdepasse"/></fieldset>
<input type="submit" name="submit" value="Se connecter"/>
</form>

connect.php

C'est ce fichier qui nous permettra d'analyser le login et le mot de passe, pour connecter l'utilisateur vers son compte ou pas.

  • On va créer une condition d'accès à la page
<?php
if(!isset($_GET['login']) && !isset($_GET['motdepasse']))
{
    header('Location: index.php');
    Exit;
}
else
{

}
?>

Grâce à cette condition, nous redirigeons l'utilisateur vers le formulaire de connexion si les variables 'login' et 'motdepasse' ne sont pas définies. En cas de succès on va pouvoir continuer l'exécution du script.

On suppose que les variables 'login' et 'motdepasse' existent et nous allons donc les traiter

<?php
if(!isset($_GET['login']) && !isset($_GET['motdepasse']))
{
    header('Location: index.php');
}
else
{
    // On va vérifier les variables
    if(!preg_match('/^[[:alnum:]]+$/', $_GET['login']) or
!preg_match('/^[[:alnum:]]+$/', $_GET['motdepasse']))
    {
        echo 'Vous devez entrer uniquement des lettres ou des chiffres <br/>';
        echo '<a href="index.php" temp_href="index.php">Réessayer</a>';
        exit();
    }
    else
    {
        require('config.php'); // On réclame le fichier
        $login = $_GET['login'];
        $motdepasse = $_GET['motdepasse'];
    }
}
?>

Ici grâce à la fonction pcre : preg_match(), on vérifie si les caractères passés comme login et mot de passe sont des lettres et/ou des chiffres. (CETTE OPERATION N'EST PAS VRAIMENT UTILE)

Dans le cas où un caractère non alphanumérique est trouvé un message d'erreur s'affichera et invitera l'utilisateur à réessayer. Sinon dans le cas contraire, on inclue notre fichier 'config.php' et pour plus d'aisance dans le script on crée les variables « $login »et « $motdepasse ».

Laissons un moment notre fichier connect.php et rendons-nous sur le fichier config.php, pour y ajouter une nouvelle constante : _MAX_TENTATIVE à laquelle nous allons affecter une valeur : « 3 » par exemple.

Define('_MAX_TENTATIVE', 3) ;

Cette constante, limitera le nombre de tentative de connexion au compte utilisateur.

1- Revenons maintenant à notre page connect.php :

Si les deux éléments ne coïncident pas on va enregistrer la tentative.

Si le quota de tentative est atteint on empêche purement l'accès au compte jusqu'au jour suivant :

<?php
if(mysql_num_rows($requete_2)==0)
{
    // On va récupérer les résultats
    $result = mysql_fetch_array($requete_1, MYSQL_ASSOC);

    // On va récupérer la date de la dernière connexion
    $lastconnection = explode(' ', $result["dates"]);
    $lastjour = explode('-', $lastconnection[0]);

    // On va récupérer le nombre de tentative et l'affecter
    $nbr_essai = $result["nbr_connect"];

    if($lastjour[2]==date("d") && _MAX_TENTATIVE==$nbr_essai)
    {
        echo 'Vous avez atteint le quota de tentative, essayez demain !<br/>';
        exit();
    }
    else
    {
        $nbr_essai++;
        $update = "UPDATE table_utilisateur SET nbr_connect='".$nbr_essai."', dates=NOW()
WHERE id='".$result["id"]."'";

        mysql_query($update) or die ( mysql_error() );

        echo 'Le mot de passe et/ou le login sont incorrectes <br/>';
        echo '<a href="index.php" href="index.php">Réessayer</a>';
        exit();
    }
}
?>

La ligne en bleu enregistre les tentatives de connexions.

Si les deux éléments coïncident, on réinitialise le nombre de tentative et on met à jour la date de la dernière connexion :

<?php

else
{
    $nbr_essai++;
    $update = "UPDATE table_utilisateur SET nbr_connect='".$nbr_essai."', dates=NOW()
WHERE id='".$result["id"]."'";

    mysql_query($update) or die ( mysql_error() );

    echo 'Le mot de passe et/ou le login sont incorrectes <br/>';
    echo '<a href="index.php" temp_href="index.php">Réessayer</a>';
    exit();
}
?>

Puis, on redirige vers le dossier membres par exemple.

1- Notre fichier complet 'connect.php', nous donne :

<?php
if(!isset($_GET['login']) && !isset($_GET['motdepasse']))
{
    header('Location: index.php');
}
else
{
    // On va vérifier les variables
    if(!preg_match('/^[[:alnum:]]+$/', $_GET['login']) or
!preg_match('/^[[:alnum:]]+$/', $_GET['motdepasse']))
    {
        echo 'Vous devez entrer uniquement des lettres ou des chiffres <br/>';
        echo '<a href="index.php" temp_href="index.php">Réessayer</a>';
        exit();
    }
    else
    {
        require('config.php'); // On réclame le fichier

        $login = $_GET['login'];
        $motdepasse = $_GET['motdepasse'];

        $sql = "SELECT * FROM table_utilisateur WHERE user='".mysql_escape_string($login)."'";

        // On vérifie si ce login existe
        $requete_1 = mysql_query($sql) or die ( mysql_error() );

        if(mysql_num_rows($requete_1)==0)
        {
            echo 'Ce login n'existe pas ! <br/>';
            echo '<a href="index.php" temp_href="index.php">Réessayer</a>';
            exit();
        }
        else
        {
            // On vérifie si le login et le mot de passe correspondent au compte utilisateur
            $requete_2 = mysql_query($sql." AND pass='".mysql_escape_string($motdepasse)."'")
or die ( mysql_error() );

            if(mysql_num_rows($requete_2)==0)
            {
                // On va récupérer les résultats
                $result = mysql_fetch_array($requete_1, MYSQL_ASSOC);

                // On va récupérer la date de la dernière connexion
                $lastconnection = explode(' ', $result["dates"]);
                $lastjour = explode('-', $lastconnection[0]);

                // On va récupérer le nombre de tentative et l'affecter
                $nbr_essai = $result["nbr_connect"];

                if($lastjour[2]==date("d") && $MAX_essai==$nbr_essai)
                {
                    echo 'Vous avez atteint le quota de tentative, essayez demain !<br/>';
                    exit();
                }
                else
                {
                    $nbr_essai++;
                    $update = "UPDATE table_utilisateur SET nbr_connect='".$nbr_essai."', dates=NOW()
WHERE id='".$result["id"]."'";

                    mysql_query($update) or die ( mysql_error() );

                    echo 'Le mot de passe et/ou le login sont incorrectes <br/>';
                    echo '<a href="index.php" href="index.php">Réessayer</a>';
                    exit();
                }
            }
            else
            {
                // On va récupérer les résultats
                $result = mysql_fetch_array($requete_2, MYSQL_ASSOC);

                $nbr_essai = 0;
                $update = "UPDATE table_utilisateur SET nbr_connect='".$nbr_essai."', dates=NOW()
WHERE id='".$result["id"]."'";

                mysql_query($update) or die ( mysql_error() );

                // On redirige vers la partie membre
                header('Location: membres/index.php');
            }
        }
    }
}
?>

Conclusion

Il est donc aisé de réaliser un script d'authentification en procédant avec un peu de logique et avec de simple fonction de base.

MISE A JOUR

Le tuto a été réalisé de manière didactique avec des fonctions de bases, mais personnellement je ne trouve pas ceci sexy ^^. Alors je vais vous 'fournir' un code plus propre et plus optimiser.

On va modifier le fichier 'config.php' et ainsi que le fichier 'connect.php'.
Un nouveau fichier sera crée 'fonctions.php'.

Fichier config.php

$DB_serveur = ' '; // Nom du serveur
$DB_utilisateur = ' '; // Nom de l'utilisateur de la base
$DB_motdepasse = ' '; // Mot de passe pour accéder à la base
$DB_base = ' '; // Nom de la base

define('_MAX_TENTATIVE', 3);

Fichier fonctions.php

Fichier connect.php

A voir également
Ce document intitulé « Exemple de création d'un script d'authentification » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous