Améliorations

Vous avez maintenant une application complète et fonctionnelle. Toutefois, si vous le souhaitez, il est encore possible d’y apporter quelques améliorations, tant au niveau de la sécurité qu’à celui des fonctionnalités.

Failles de sécurité

Vous l’avez constaté durant la lecture de ce tutoriel, cette application contient des failles de sécurité au niveau des événements socket côté client. En effet, un utilisateur peut ouvrir sa console web et écrire une instruction qui demandera à l’application de modifier, supprimer ou aimer un message dans la base de données. Il peut également insérer du code javascript qui s’exécutera au chargement de la page des discussions. Voici quelques exemples :

/* publie un message qui affiche une alerte
au nom d'un autre utilisateur */
socket.emit('nouveau_message', {
  nom_utilisateur : 'utilisateur_au_hasard',
  contenu : "<script>alert('Je fais tout planter !')</script>",
  id_discussion : 1
});

// aime 100 fois un message
for (var i = 0; i < 100; i++) {
  socket.emit('like_message', {
    id_message = 20,
    nom_utilisateur = 'personne'+i,
    id_discussion = 1
  });
}

// supprime 1000 messages de la base de données
for (var i = 0; i < 1000; i++) {
  socket.emit('suppression_message_serveur', {
    id_discussion : 1,
    id_message : i
  });
}

Par ailleurs, il peut même modifier le nom, le prénom et l’e-mail d’un autre utilisateur :

// modifie les coordonnées d'un utilisateur
socket.emit('modifier_compte', {
  utilisateur : 'samf',
  prenom : 'Ce forum',
  nom : 'n\'est pas',
  mail : 'sécurisé'
});

Pour supprimer cette faille de sécurité, il faudrait, par exemple, vérifier le contenu de tous les événements socket venant du client au moyen d’expressions régulières. De plus, la méthode d’authentification de l’utilisateur devrait être sécurisée au moyen d’un jeton d’authentification, comme nous l’avons fait pour la création des sessions.

Il est également possible d’utiliser d’autres middlewares nodeJS facilitant cette tâche, comme MeteorJS ou session.socket-io. Avec ce dernier, l’enregistrement de jetons d’authentification dans la base de données ne serait plus nécessaire, puisque l’utilisateur s’identifierait directement avec la session stockée sur son navigateur.

Base de données

La base de données utilisée dans cette application comporte des redondances. Pour les supprimer, le changement des colonnes nom_utilisateur en id_utilisateur s’imposerait, comme sur le schéma suivant :

_images/sr_ameliore.png

Gestion des erreurs

Lorsqu’une requête SQL contient une erreur, le programme plante. Si ce fonctionnement permet de déboguer plus aisément l’application lors de son développement, il n’est pas approprié lorsque le forum est en cours d’utilisation. Il conviendrait alors de prévoir des blocs try-catch qui continueraient l’exécution programme tout en enregistrant l’erreur dans un fichier log.

Fonctionnalités complémentaires

Ce forum contient de nombreuses fonctionnalités permettant aux utilisateurs d’échanger facilement et intuitivement. Cependant, l’ajout des fonctionnalités suivantes pourrait améliorer leur expérience :

  • Possibilité de personnaliser l’avatar à l’aide d’une image de notre choix
  • Envoi fichiers et/ou d’images jointes à des messages sans avoir besoin de les placer à partir d’un lien externe
  • Possibilité de changer le nom d’utilisateur