samedi 19 mars 2005

Espace membre

ESPACE MEMBRE

Dans cet article, nous allons voir comment créer un espace membre. Il y a plusieurs raisons de créer un espace membre, la première peut être la sécurité. Il peut être intéressant de laisser tout le monde lire des messages sur notre forum, mais seulement ceux qui sont membres d'y écrire. Nous avons ainsi de moyen de savoir qui a écrit le message, son adresse IP...
Dans cet article, nous allons voir:
  • Inscription
  • Authentification
  • Oublie de mot de passe
  • Déconnection

Inscription

L'inscription d'un membre est l'occasion d'obtenir diverses informations sur l'usager. Voici une structure de table possible :

DROP TABLE IF EXISTS `membre`;
CREATE TABLE `membre` (
  `MEM_NOMEMBRE` int(11) NOT NULL auto_increment,
  `MEM_NOM` varchar(30) NOT NULL default '',
  `MEM_PRENOM` varchar(30) NOT NULL default '',
  `MEM_NOMUSAGER` varchar(30) NOT NULL default '',
  `MEM_MOTPASSE` varchar(30) NOT NULL default '',
  `MEM_COURRIEL` varchar(30) NOT NULL default '',
  `MEM_TYPE` int(11) NOT NULL default '0',
  `MEM_SITEWEB` varchar(100) default NULL,
  `MEM_SIGNATURE` varchar(50) default NULL,
  `MEM_NBMESSAGE` int(11) default '0',
  `MEM_ENREGISTRE` int(11) default '0',
  PRIMARY KEY  (`MEM_NOMEMBRE`)
) TYPE=MyISAM AUTO_INCREMENT=9 ;
Au niveau du code, il suffit de créer un formulaire. Afin de limiter les inscriptions automatiques par des scripts malicieux, il est possible d'ajouter une série de lettres dans une image. L'usager devra taper ces lettres. De nombreux sites utilisent cette technique.

Protection

Tel que dit précédemment, il est important d'ajouter une protection afin d'éviter des inscriptions multiples. Afin de mettre en oeuvre cette protection, nous allons générer une suite de lettre de façon aléatoire et ensuite créer une image avec ces lettres. Il est ainsi beaucoup plus complexe d'obtenir la valeur des lettres.
function gen_reg_key() {

   //on initialise la variable $key à "vide"

   $key = "";

   //on définit la taille de la chaine (6 caractères ca suffit ;))

   $max_length_reg_key = 6;

   //on définit le type de caractères ascii de la chaine (l'alphabet suffit amplement, mais libre a vous)

   $chars = array(

      "a","b","c","d","e","f","g","h","i","j","k","l","m",

      "n","o","p","q","r","s","t","u","v","w","x","y","z");

   //on comptabilise le nombre total de caractères possibles (26 pour l'alphabet)

   $count = count($chars) - 1;

   //on initialise la fonction rand pour le tirage aléatoire

   srand((double)microtime()*1000000);

   //on tire aléatoirement les $max_length_reg_key caracteres de la chaine

   for($i = 0; $i < $max_length_reg_key; $i++) $key .= $chars[rand(0, $count)];

   //on renvois la clé générée

   return($key);

} 
Maintenant que la chaîne est générée, nous allons créer une image cette chaîne. Noter que la source ci-dessus provient d'une source inconnue.
//En-tête définissant le format png header

header ("Content-type: image/png"); 

//Crée une nouvelle image à palette d'une taille de 100 pixels de largeur par 50 pixels de hauteur

$im = @ImageCreate (100, 50) or die ("Erreur lors de la création de l'image");

//Alloue une couleur pour le fond de l'image

$bgcolor = ImageColorAllocate ($im, 0xC0, 0xC0, 0xC0); //Ca correspond à #C0C0C0

//Alloue une couleur pour le texte de l'image

$font = ImageColorAllocate ($im, 0x00, 0x00, 0x00);

ImageString ($im, 5, 20, 15,base64_decode($_GET['code']),$font);

//Envoie l'image PNG vers le navigateur

ImagePng ($im);

//Désalloue la mémoire de l'image
ImageDestroy($im);

La chaîne générée est passée à ce script d'où le $_Get. La protection ainsi que les données entrées par l'usager doivent être validées afin d'insérer des données uniquement valides dans la base de données. Au niveau des validations, vous pouvez vérifier si le courriel est valide, si le nom de l'utilisateur est déjà présent.

Envoie du courriel

Il est très aisé d'envoyer un courrier en PHP. Le code ci-dessous est employé pour activer le mot compte de l'usager lors de son inscription. Il faut s'assurer d'avoir la fonction PHP mail().
function envoiecourrielvalidation($nom, $nomusager, $to, $motpasse, $nomembre)
  {
    /* sujet */
    $subject = "Inscription: La boîte à prog";
  
    /* message */
    $message = "Bonjour, ".$nom." ! \n\nMerci de vous être enregistré.   Vous êtes priés de conserver cet e-mail dans vos archives. \nVoici les informations concernant votre compte : \n \nNom d'utilisation : ".$nomusager." \nMot de passe: ".$motpasse." \n \nPour activer votre compte, veuillez cliquer sur ce lien :  http://www.laboiteaprog.com/activation.php?mem_nomembre=$nomembre  \n\nL'équipe Forum La boîte à prog";
  
    $headers = "From: La boite à prog <collinm@laboiteaprog.com>\r\n";
    /* and now mail it */
    mail($to, $subject, $message, $headers);
 }

Validation du courriel

Une manière de limiter les abus est de valider le compte de l'usager en lui envoyant un courriel. Cette façon permet de savoir si le courriel inscrit par l'usager est valide et assure de pouvoir retracer l'usager si nécessaire. La validation du courriel se fait si toutes les données entrées par l'usager sont valides. Utiliser la fonction mail de PHP pour envoyer un courriel. Utiliser un gabarit tel que:

Bonjour, Paul Newman !
Merci de vous être enregistré.   
Vous êtes priés de conserver ce courriel dans vos archives.

Voici les informations concernant votre compte : 
Nom d'utilisation : pauln
Mot de passe: arlvlr

Pour activer votre compte, veuillez cliquer sur ce lien :  http://www.laboiteaprog.com/activation.php?mem_nomembre=1

L'équipe Forum La boîte à prog";

Dans le script activation, on vérifie si l'usager à déjà activer son compte. Le champ MEM_ENREGISTRE sert à savoir si l'usager a déjà activé son compte. Si la valeur est 0, son compte n’est pas actif.

connectionbd();
    entete("Activation","");
    
    $mem_nomembre = $_GET['mem_nomembre'];
    
    
    $requete = mysql_query("SELECT mem_nomembre, mem_motpasse, mem_type, mem_enregistre from membre where mem_nomembre=$mem_nomembre ");
    
    $ligne = mysql_fetch_assoc($requete);
    
    //verifier dans la bd si le compte est déjà actif... si oui on affiche un message
    if($ligne["mem_enregistre"] == 1){
    
      echo '<div>Activation</div>';
      echo'<div>';
        
      echo"Votre compte a déjà été activé. Merci";
        
      echo'</div>';
    
    }
    else{
    
      $_SESSION['username'] = $username;
      $_SESSION['password'] = $password;
      $_SESSION['mem_nomembre'] = $mem_nomembre;
      
      mysql_query("update membre set mem_enregistre = 1 where  mem_nomembre= $mem_nomembre ");
      
      echo '<div >Activation</div>';
      echo'<br/><div>';
      echo"Vous venez d'activer votre compte, vous pouvez maintenant envoyez des messages et participer au site. Merci";
        
      echo'</div>';
      
    }
    closebd();
    piedpage();
  }
Si le compte de l'usager n'est pas encore actif, il le devient et on enregistre des variables de session afin que l'usager puise avoir accès aux fonctions réservées au membre.

Authentification

Cette partie consiste à vérifier le nom d'utilisateur ainsi que le mot de passe entrée par l'usager, si les informations sont valides, l'usager à accès au site et on enregistre dans des variables de session quelques informations (tel que vue précédemment). Le code nécessaire pour vérifier les données est identique à celui montré précédemment. Si les données sont valides, nous pouvons rediriger l'usager par exemple dans une section spéciale du site.

Oublie de mot de passe

Il est possible, qu'un usager oublie son mot de passe pour de multiples raisons. Un script qui génèrera un mot de passe aléatoire permettra de nouveau à l'usager de se connecter au site.

Le script pour générer un mot aléatoire qui a été utilisé lors d'un l'inscription de l'usager peut être réutilisé de nouveau pour l'oublie d'un mot de passe. Le nouveau mot de passe est envoyé par courriel à l'usager. Un gabarit qui pourrait ressembler à celui montré dans la section Validation du courriel peut être utilisé.

Déconnection

Cette fonctionnalité supprime les variables de session créée lors de la connexion de l'usager et redirige l'usager sur la page principale du site.

session_start();
if(session_is_registered("username")){
  session_destroy();
$url="/index";
header("location: $url");

Fonctionnalité

Une fois que l'utilisateur est connecté, tous vous est permis. Prenons exemple sur ce site, une fois connecté, vous pouvez participer au site, modifiez votre profil...
Nous avons vu quelques fonctionnalités de base pour gérer un espace membre sur un site.

D'autres fonctionnalités peuvent être ajoutées, un chat en ligne, amélioration de la sécurité... afin d'avoir un espace membre encore plus riche.