#########  Sub0 - Developpez.com - 23/09/06

ESPACE MEMBRE DELPHP

Ce programme est destiné à être utiliser dans un projet tel qu'un tchat ou un jeu en ligne. Il s'intègre très facilement et s'utilise comme une boîte de dialogue modale. Il intègre un formulaire d'inscription, un formulaire d'identification et de réinscription (perte de mot de passe). Cet espace membre est configurable pour obtenir un niveau plus ou moins sécurisé. Le fonctionnement est le même qu'un espace membre en PHP excepté que les formulaires sont programmés et affichés avec Delphi au lieu d'être affichés par un navigateur web au format HTML.

 

UTILISATION

INSCRIPTION
 

L'utilisateur doit s'inscrire pour devenir membre et pouvoir accéder aux fonctions sécurisées. Selon les options choisies par l'administrateur, une adresse mail valide et la saisie du code image anti-robots sont nécessaires pour effectuer une inscription. Une fois le formulaire validé, le programme émet un message confirmant l'enregistrement. Dans le cas où une adresse mail est demandée, un e-mail d'activation est envoyé au membre. Ce courrier contient une url à exécuter qui validera l'inscription du membre et permettra ainsi de verifier cette adresse. L'inscription ne sera effective que lorsque le compte sera activé.
 

#########

IDENTIFICATION
 

Le membre doit s'identifier pour pouvoir accéder aux pages PHP sécurisées. Une session est créée. Cette dernière est supprimée au bout de 5 minutes d'inactivité ou si l'IP du membre change. La reconnection peut être effectuée automatiquement. La durée de vie d'une session est paramètrable. Un nombre d'essai maximal d'identification peut être défini afin de bloquer le compte un certain temps.
 

#########

PERTE DE MOT DE PASSE

Selon l'option choisie par l'administrateur, lorsque l'identification échoue, le membre est redirigé sur le formulaire de réinscription. Ce formulaire n'est disponible que si l'activation du compte s'effectue par mail. Le paramètre $cfg['mail_act'] doit donc être activé. Si le nombre d'échec de connection maximal est atteint, le compte est alors bloqué pendant 15 minutes. L'administrateur reçoit un mail l'informant de ce premier blocage. Au bout de 15 minutes, l'utilisateur redispose d'un seul nouvel essai.

#########
 

DECONNECTION

La déconnection s'effectue automatiquement lorsque le programme est fermé et lorsque le dialogue est détruit. Note : Si le programme n'est pas terminé proprement, par exemple, dans le gestionnaire des tâches ou par un reboot du système, la session ne sera pas détruite et bloquera la prochaine connection le temps que cette session soit périmée.

 

INSTALLATION & CONFIGURATION

SOURCES

L'archive contient les fichiers sources pour Delphi ainsi que les scripts PHP. Ces-derniers sont regroupés dans une archive nommée "php.zip" :
loginunit.zip
 

INSTALLATION PHP

La plupart de mes projets PHP/MySQL débutent toujours avec les 3 mêmes scripts :
-
config.php contient les constantes, tableaux et les variables globales du projet.
-
bdd.php contient les fonctions de création et d'accès de la base de données.
-
func.php contient diverses fonctions.

Les scripts suivants sont spécifiques à l'espace membre :
-
connect.php contient le code qui vérifiera la connection du client.
-
admin.php est la page sécurisée du programme.
-
font.php est en fait la police "Arial.ttf" utilisée pour les images de code.

Ces scripts sont à installer sur votre serveur, dans le dossier de votre choix (par défaut, utilisez le nom de dossier "delphp").
 

CONFIGURATION PHP

Avant toutes choses, vous devez définir les paramètres de configuration du programme qui se trouvent dans le script
config.php, en particulier les paramètres d'accès de la base de données.

Ci-dessous, le détail des autres paramètres de configuration :
 

$cfg['mail_adm']='delphp@server.fr';

Adresse mail de l'administrateur. Cette adresse est utilisée pour définir l'expéditeur dans les mails d'activation. Elle est aussi utilisée comme destinataire pour envoyer un mail d'alerte lors d'une éventuelle attaque. Si ce paramètre est vide, aucun mail d'alerte est envoyé à l'administrateur.
 

$cfg['mail_act']=true;

Activation de l'inscription par mail. Ce paramètre doit être activé si vous souhaitez sécuriser votre espace membre et obtenir une adresse mail valide pour chaque membre. Si ce paramètre est mis à False, les inscriptions seront automatiquement activées dès leur création.
 

$cfg['delay_act']=2*3600;

Durée de réservation du pseudo (par défaut, 2 heures). Ce paramètre n'est valable qu'avec une activation par mail. Il permet de libérer le pseudo dans le cas où l'inscription n'est pas activée dans ce lapse de temps.
 

$cfg['perim_act']=true;

Détermine si le mail d'activation devient inutilisable dans le cas où le lien ne serait pas exécuté dans le lapse de temps défini par la paramètre précédent "delay_act". Si ce paramètre est mis à False, la libération du pseudo est effectuée à la fin du temps imparti mais l'activation du compte reste malgré tout possible seulement si le pseudo n'est pas réutilisé par une autre inscription.
 

$cfg['im_protect']=true;

Les inscriptions sont protégées par une image de code anti-robots. Ces images sont au format Jpeg. Elles sont enregistrées dans le dossier temporaire défini par le paramètre "tmp_dir". Lors de la toute première création d'une image de code, le dossier est créé si il n'existe pas et un fichier nommé "index.php" est ajouté dans ce dossier afin d'interdire l'affichage de son contenu et ainsi, protéger le nom de fichier des images.
Le nom d'une image de code est obtenu avec le chiffrage md5 du code qu'elle contient, précédé d'un second code aléatoire (imastr). Ce-dernier est une empreinte du code de l'image et permet de reconnaître l'image sans devoir fournir le code qu'elle contient.
Ces images sont automatiquement supprimées du dossier lorsque leur durée de vie est supérieure ou égale à la durée de vie d'une session, soit 5 minutes. L'image est également supprimée du dossier une fois qu'elle a été utilisée.
 

$cfg['max_att']=4;

Nombre maximal d'échecs ou d'attaques consécutifs admissibles. Ce paramètre est utilisé pour bloquer le compte ou annuler l'inscription lorsque l'utilisateur fournit une suite de mots de passe ou clés d'activation invalides. Lors d'une suppression d'inscription ou de réinscription, un mail d'alerte contenant toutes les informations possibles sur l'attaque est envoyé à l'administrateur.
Si ce paramètre est égal à zéro,  le compte n'est pas bloqué et le nombre d'échec est illimité. Néanmoins, un délai de 3 secondes est ajouté à chaque essai afin de freiner le robot en cas de tentative de piratage du mot de passe par force brute. Concernant l'activation du compte si ce paramètre est égal à zéro, l'utilisateur ne disposera que d'un seul essai.
 

$cfg['delay_att']=15*60;

Durée de blocage du compte (par défaut, 15 minutes). Lorsque le temps de blocage est dépassé, l'utilisateur dispose d'un nouvel essai.
 

$cfg['max_newmdp']=3;

Nombre maximal de réinscriptions admissibles utilisé pour pouvoir effectuer une demande de nouveau mot de passe. Si ce paramètre est égal à zéro, le membre ne pourra pas changer de mot de passe. Dans ce cas, le formulaire de perte de mot de passe est désactivé.
 

$cfg['max_compte']=3;

Nombre maximal de compte pour un poste. Le programme utilise l'IP et/ou l'adresse mail pour déterminer si il s'agit d'un même poste ou non. Si ce paramètre est égal à zéro, les inscriptions ne seront plus permises.
 

$ses['ses_name']='delphp';

Nom utilisé pour la session. Ce paramètre est également utilisé pour nommer l'expéditeur dans le mail d'activation.
 

$ses['lifetime']=5*60;

Durée de vie de la session (par défaut, 5 minutes). Ce paramètre est aussi utilisé pour la durée de vie des images de code. Ainsi, toutes les images de code qui ont plus de 5 minutes sont automatiquement supprimées du dossier temporaire. Cela signifie aussi que l'utilisateur ne disposera que de 5 minutes pour s'inscrire. Dans le cas contraire, une nouvelle image de code lui sera fournie.
 

Pour pouvoir sécuriser correctement cet espace membre, vous devez définir le paramètre SMTP de votre serveur de façon à ce qu'il puisse envoyer des mails. Ce paramètre se trouve dans le fichier php.ini. De la même manière, vous devez activer l'extension GD2 pour pouvoir utiliser les images de code avec la police Arial. N'oubliez pas qu'il est nécessaire de redémarrer votre serveur pour que ces changements soient pris en compte. Si vous souhaitez utiliser un serveur SMTP distant, je vous conseille l'utilisation de la librairie PHPMailer.
 

SESSIONS PHP

Les sessions permettent de mémoriser l'identification. Une session sera valable 5 minutes, durée définie dans le script
config.php. Il y a en tout 4 fonctions dédiées aux sessions : Création, test de connection, destruction, regénération du SID. Elles sont déclarées dans le script func.php.

Le composant
THttpCli d'ICS utilise l'événement OnCookie pour récupérer le SID et le retransmettre automatiquement au serveur. Le SID est redéfini à chaque connection par le script PHP pour contrer le vol de session. Le SID intègre le pseudo et un code aléatoire unique pour ne permettre qu'une seule connection possible par pseudo.

Petite parenthèse, surtout si vous débutez avec PHP, sachez que :
• Les fonctions de sessions fonctionnent comme pour les headers : Il n'est pas possible d'utiliser les fonctions
session_start ou header si le script PHP a déjà affiché quelque chose. Dans ce cas, vous aurez un message d'erreur du genre :
Warning: Cannot modify header information - headers already sent by (output started at...
• A propos des messages d'erreur PHP justement, je vous rappelle qu'un arobas
@ qui précède une fonction permettra de masquer les messages d'erreur PHP de cette fonction. Ne l'utilisez que si vous êtes sûr de votre code ou que si vous gérez vous-même l'affichage des erreurs.

DROITS D'ACCES

Pour protéger n'importe quel script PHP, il suffira de placer au tout début du script, le code suivant :

Require_once('connect.php');

Ainsi, seuls les membres authentifiés auront la permission d'utiliser ce script.

Il serait facile d'attribuer des droits pour chacun des membres en ajoutant un champs supplémentaire dans la table de données et un test dans le code PHP... Une autre possibilité plus simple est d'utiliser directement le pseudo. Par exemple, vous devez vous inscrire avec le pseudo d'accès de votre base de données (root) pour vous réserver les droits d'administration et ainsi interdire l'accès d'une fonction si le membre ne s'est pas identifié comme l'administrateur :

if(strtolower($_SESSION['pseudo'])!=strtolower($cfg['db_login']))

  
die('Vous n\'êtes pas autorisés à utiliser cette page. <br/>'.
      
'Seul le pseudo «'.$cfg['db_login'].'» est autorisé.');
 

TABLE DE DONNEES

Voici une rapide description du contenu de la table «membres». Cette table est créée automatiquement, comme la base de données d'ailleurs, si elles n'existent pas. A noter que la commande "IF NOT EXISTS" n'est disponible qu'à partir de la version 4 de MySQL. Voici la structure de cette table :
 

1

`id` int(4) auto_increment

 Identifiant auto-incrémenté

2

`pseudo` varchar(255) default ''

 Pseudo pour l'identification

3

`mdp` varchar(255) default ''

 Mot de passe principal (md5)

4

`newmdp` varchar(255) default ''

 Nouveau mot de passe à activer (md5)

5

`compte` varchar(255) default ''

 Nombre de réinscriptions activées

6

`email` varchar(255) default ''

 Adresse mail pour l'inscription

7

`date_reg` datetime

 Date & heures de création du compte

8

`date_act` datetime

 Date & heures d'activation du compte

9

`date_log` datetime

 Date & heures de la dernière connection

10

`ip` varchar(255) default ''

 IP | Host de l'utilisateur

11

`active` varchar(255) default ''

 Clé d'activation / blocage du compte

12

`attack` varchar(255) default ''

 Nombre de connections échouées

Le champs newmdp (n°4) est utilisé lors d'une demande d'un nouveau mot de passe. L'ancien mot de passe reste valide tant que le nouveau mot de passe n'est pas complètement activé. La clé contenue dans le champs newmdp intègre 4 éléments séparés par le caractère "|". Le mail d'activation fournit juste le premier élément de cette clé. Ces éléments sont dans l'ordre : La clé d'activation composée d'un code aléatoire et du pseudo codé en hexadécimal (ASCII), le nouveau mot de passe chiffré avec md5, la date de la demande du nouveau mot de passe utilisée pour calculer la durée de vie de cette demande, et enfin, du nombre d'échec d'activation du nouveau mot de passe.

Le champs compte (n°5) contient le nombre de compte activé pour un poste. L'IP et l'adresse mail sont utilisées pour identifier le poste.

Le champs ip (n°10) contient l'IP du membre suivi d'un séparateur "|" et de l'Host.

Lors d'une inscription activée par mail, la clé d'activation est enregistrée dans le champs active (n°11). Cette clé est composée d'un code aléatoire et du pseudo codé en hexadécimal (ASCII). Le mail d'activation fournit juste cette première partie de la clé. La clé détient également le nombre d'échec d'activation séparé par le caractère "|". Le champs "active" est mis à 0 lorsque le compte est bloqué et à 1 lorsque le compte est activé.

Le champs attack (n°12) est dédié à l'enregistrement d'échecs d'identification et fournit le nombre d'essai encore disponible.
 

INSTALLATION DELPHI

L'espace membre s'intègre facilement dans un projet. Il suffit d'ajouter l'unité
LoginUnit.pas à votre fiche principale de votre projet dans le gestionnaire de projet. Ainsi, l'espace membre se comportera comme une boîte de dialogue modale. Dans le fichier DPR, vous obtenez l'ordre de création suivant :

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TLogForm, LogForm);
Application.Run;

De cette manière, la fiche de l'espace membre est créée juste après et détruite juste avant la fiche principale du projet. L'ouverture du dialogue peut se faire soit manuellement en exécutant la méthode ShowFormulaire ou TestConnection, soit automatiquement à la création de la fiche ou lorsque le programme accède à un script PHP sécurisé et que l'utilisateur n'est pas encore identifié.
 

CONFIGURATION DELPHI

Le principal paramètre du programme est l'url du serveur utilisé pour accéder aux scripts PHP. Cette adresse se trouve dans le code source du programme, mais il est également possible de définir cette url dans le fichier INI du programme. De la même manière, vous pouvez redéfinir le port et la valeur du TimeOut. Il conviendra d'adapter le programme à votre application. En général, vous ne donnerez pas la possibilité aux utilisateurs de modifier ces paramètres.

D'autres paramètres sont disponibles dans l'unité
LoginUnit.pas :

AutoStart: Boolean = False;     { Lancement automatique au démarrage }
AutoValid: Boolean = False;     { Formulaire auto validé si pré-rempli }
ModalForm: Boolean = True;      { Le dialogue est modal avec fsStayOnTop }
AutoCenter: Boolean = True;     { Le dialogue se centre au milieu de la form }

Il est prévu également de pouvoir choisir la couleur du dialogue. Par défaut, ces couleurs sont celles du système (clDefault). L'image de code utilise également les couleurs du dialogue. Voici 2 exemples de couleurs personnalisées :

#########

#########

    BackColor: TColor = $FFDDDD;
    HighColor: TColor = $FFFFFF;
    ProgColor: TColor = $BB5555;
    TextColor: TColor = $BB5555;
    BarLColor: TColor = $BB5555;
    BarRColor: TColor = $FFFFFF;
    BarTColor: TColor = $FFFFFF;

    BackColor: TColor = $808080;
    HighColor: TColor = $000000;
    ProgColor: TColor = $DDDDDD;
    TextColor: TColor = $FFFFFF;
    BarLColor: TColor = $000000;
    BarRColor: TColor = $DDDDDD;
    BarTColor: TColor = $FFFFFF;

Cliquer ici pour lire la suite de l'article...