Sécurisation de Serveur Persistant par mot de passe

Répondre
Partager Rechercher
Téléchargement : Fichier Zip
Page du projet : Github

Le serveur de clef Bioware ayant rendu l'âme suite à une attaque du groupe LulzSec, la sécurisation des comptes joueurs est devenue hasardeuse.

Les scripts fournis, oeuvre de Crom29 avec la participation de Lv4, devraient répondre à vos besoins les plus courants.

Le projet intègre un module nwn2 et un fichier erf à importer.

Fichier Readme :
Code PHP:

Ce package comprend le script requis pour une sécurisation de votre module
persistant
.

Le systeme fonctionne avec la base de données campagne du serveur.

Vous trouverez dans le répertoire erf les deux fichiers à ajouter à votre module


////////////////////////////////////////////////////////////////////////////////
// e_mod_pconload.nss
////////////////////////////////////////////////////////////////////////////////
 
 
Script correspondant à l'evenement OnPCLoaded du module.
 
 En cas d'
ajout à un script existantajoutez simplement la fonction Secu() et 
 appelez la dans le contexte principal 
(main() ) du script.
 
 
 
////////////////////////////////////////////////////////////////////////////////
// gui_secu_script.nss
////////////////////////////////////////////////////////////////////////////////
 
 
Script correspondant à la saisie du mot de passe par le joueur
En résumé, ce système enregistre un mot de passe supplémentaire pour le joueur en fonction de ses informations personnelles et permet d'éviter une usurpation d'identité trop facile.

Merci pour votre feedback.
Quel est le besoin réel ?

Il y a t'il un vrai risque de se faire piquer sa clef ? J'veux dire, nwn2 est plus vraiment le jeux à la mode, non ?

Ou c'est qu'à cause de ce piratage, on peut plus facilement piquer le compte d'un autre joueur ?

Je comprend pas trop les implications de ce piratage en fait...
Citation :
éviter une usurpation d'identité trop facile.
Comme les serveurs d'auth sont morts, n'importe qui peut se connecter avec n'importe quel compte. Le mot de passe n'est pas vérifié.
Ce n'est pas ta clé qui serait volée, mais ton compte.
En fait à l'heure actuelle, n'importe qui peut usurper le compte de n'importe quel joueur à condition de connaître son identifiant Bioware.

Alice dont l'identifiant Bioware est "Alice" crée un personnage nommé "Adamanta" sur le serveur Synveril .

Bob en utilisant l'identifiant Bioware "Alice" peut en ce moment jouer le personnage Adamanta sur Synveril sans qu'Alice le sache.

Pourquoi ? Car le Master Server des clefs Bioware qui enregistrait les mots de passe est tombé et que par défaut quand ce serveur n'est pas joignable, le jeu fait confiance au joueur.


Depuis assez longtemps, certains serveurs ont mis en place des systèmes pour sécuriser l'accès aux personnages d'un joueur (NWN2 est une vraie passoire niveau sécurité) avec des méthodes plus ou moins fermes. Lyncya, de mémoire, était par exemple extrêmement ferme.

Le système de Crom29 et Lv4 est plutôt souple. Qu'en pensez-vous ?

NB : 1. Administrateurs de PWs, vous ne pourrez pas dire que vous ne saviez pas. 2. Il ne semble pas que Bioware soit très pressé de remettre en place un Master Server. Ça pourrait durer encore longtemps.
Thumbs up
Merci !
j’étais au courant de ce problème mais sans solution j’évitai de trop le répandre pour évité de réel problème sur le serveur.

J’étais partie sur une façon de liée une clée cd a un login.. Ton idée semble plus simple et déjà réalisable en plus.

Je transfert au staff technique du module de-suite.

Merci pour la communauté
__________________
http://www.monsterup.com/upload/1260278390503.jpg
Mon Hymne depuis T4c (caern) : Pouvoir des joueurs
Serveur nwn² où je traine actuellement : http://jolstatic.fr/forums/signaturepics/sigpic1441_1.gif
Pas encore trouvé mieux, ouvert a toute proposition pour des terres nouvelle rp
question j'ai transmis le trés bon boulot au staff du module où je traîne

il se trouve qu'il préfère faire un système avec la BDD sql plutôt que la BDD campagne. selon ses mots : "Mais il faut l'adapter de toute façon au script d'entrée du joueur qui est spécifique à chaque module. De plus je ferai un mot de passe par joueur et non pas par PJ, et surtout pas lié au nom du PJ (c'est l'inconvénient de la base de donnée campagne) car ça met la grosse pagaille dès qu'il y a changement de nom."

En tout cas je doute pas que ce qui est ici est déjà une bonne aide. En tout cas je me demande bien comment réussir ce genre de passe en sql sachant que sur le module en question on peut en effet changer son nom de pj
la BDD bioware à l'inconvénient d'être lente (ça reste correct, la colère d'aurile tourne exclusivement en campaign, et il n'y a aucun problèmes), mais elle a l'avantage d'être utilisable par n'importe quel module.
La BDD mysql est beaucoup plus rapide, mais requiers nwnx4 et un server mysql.
A mon avis, il n'y a pas besoin d'adapter le script au mysql : il n'y a que 3 requêtes sur la BDD à l'entrée d'un joueur en temps normal (si il doit entrer son mdp, il y aura un peu plus de requêtes, mais ça reste en dessous de 5-6)

ensuite le système ne fonctionne pas avec le nom du personnage (GetName(oPC)), mais avec le nom du compte bioware (GetPCPlayerName(oPC))
On peut donc changer sans problèmes le nom du personnage, sans avoir de problèmes
__________________
http://img.xooimage.com/files21/b/4/0/bann_lcda-500x100-12abc53.gif
Bonjour,
Pour compléter la réponse d'Okalik, nous sauvegardons déjà sur base de donnée SQL les informations de compte joueur, clé CD et adresse IP. Il est donc très simple de rajouter à ces informations le mot de passe joueur, sans créer par ailleurs une autre structure. Cela permet aussi d'enquêter en cas de fraude éventuelle ...

Je remercie néanmoins les contributeurs qui ont fourni leurs scripts, tout le travail mis a disposition sur le forum est très utile.

Et en plus, ça m'a motivé pour sortir ma modif plus rapidement
Ajout mot de passe avec une base mysql.

Le kit nwnx4 est fourni avec un ensemble de tables permettant de stocker les informations liées aux joueurs et personnages. Je m'intéresse ici à la table "table_player" qui contient les informations joueur. J'ai donc ajouté dans mon exemple un nouveau champ "MotDePasse" de type varchar, longueur 20 caractères (avec le logiciel SQlyog par exemple). Il est créé par défaut avec une valeur vide.

Le code suivant permet de gérer le mot de passe (initialisation / saisie), il est à placer à la fin de la suite de scripts appelés sur l'événement OnPCLoaded du module.
Code:
// Gestion Mote de Passe Joueur
 
 string MdP = DBReadString("Table_Player", "MotDePasse", "PlayerName='" + SQLEncode(GetPCPlayerName(oPC)) + "'");
 if (MdP == "")
 // Initialisation du mot de passe
 {
   DisplayInputBox(oPC,
                0,
                "Veuillez initialiser votre mot de passe Joueur (20 caractères max) : conservez ce mot de passe!",
                "gui_init_mdp",
                "gui_client_enterc",
                TRUE,
                "SCREEN_STRINGINPUT_MESSAGEBOX",
                0,
                "Valider",
                0,
                "Quitter le jeu",
                ""); 
 
 }
 else
 // Vérification du mot de passe
 {
   DisplayInputBox(oPC,
                0,
                "Veuillez saisir votre mot de passe Joueur",
                "gui_verif_mdp",
                "gui_client_enterc",
                TRUE,
                "SCREEN_STRINGINPUT_MESSAGEBOX",
                0,
                "Valider",
                0,
                "Quitter le jeu",
                "");        
 }
Le script "gui_init_mdp" permet d'enregistrer le mot de passe lors de la première utilisation.
Code:
/*********************************************************************************\
//:: Torcafel - 2011 :://
//:: Mot de passe Joueur
//::
\*********************************************************************************/
#include "db_inc_functions"
 
void main(string sVar)
{
 if (sVar == "" || GetStringLength(sVar) == 0 || sVar == " ") BootPC(OBJECT_SELF);
 else
 {
  SendMessageToPC(OBJECT_SELF, "Mot de passe enregistré : " + sVar);
  string sSQL = "SET MotDePasse='" + sVar + "'";
     DBSQLCmd("UPDATE " + gTable_Prefix + "Table_Player " + sSQL + " WHERE PlayerID=" + IntToString(GetPlayerID(OBJECT_SELF)));
 }  
}
Le script "gui_verif_mdp" permet de vérifier le mot de passe.
Code:
/*********************************************************************************\
//:: Torcafel - 2011 :://
//:: Mot de passe Joueur
//::
\*********************************************************************************/
#include "db_inc_database"
void main(string sVar)
{
 string MdP = DBReadString("Table_Player", "MotDePasse", "PlayerName='" + SQLEncode(GetPCPlayerName(OBJECT_SELF)) + "'");
 if (MdP == sVar) SendMessageToPC(OBJECT_SELF, "Mot de passe valide");
 else
 {
  SendMessageToPC(OBJECT_SELF, "Mot de passe invalide");
  BootPC(OBJECT_SELF);
 }
 
}
Le dernier script "gui_client_enterc" déjà présent dans le module permet d'éjecter le joueur en cas de mot de passe invalide.
Code:
void main()
{
 object oPC = OBJECT_SELF;
 BootPC(oPC);
}
Merci pour la version SQL. À titre personnel, je me demande si quelques optimisations pour le confort et la sécurité ne seraient pas possibles.

Ex :
- Supprimer les espaces et afficher le mot de passe qui a été enregistré
- Ne pas booter en cas de mauvais mot de passe mais afficher de nouveau l'invite de mot de passe avec un message d'erreur
- Stocker le mot de passe en BDD avec une méthode de chiffrement ( MD5, SHA ), ce que MySQL permet facilement ( ex:
Code PHP:

string sSQL "SET MotDePasse=MD5('" sVar "'); 

Si j'avais le temps, j'adapterai volontiers le système de Crom29 pour qu'il sauvegarde au choix en mode campagne ou en SQL, mais bon.
J'ai dû faire une correction sur le script "gui_secu_script"
il faut re-télécharger l'ensemble et importer "NWN2_PW_Security_fix28-08-11.erf" sur le module.
Pour ceux qui n'ont pas encore mis en place, il ne faudras importer que "NWN2_PW_Security.erf".

Lien du zip : https://github.com/albancrommer/NWN2...zipball/master


concernant une version mysql, je bosse actuellement dessus
__________________
http://img.xooimage.com/files21/b/4/0/bann_lcda-500x100-12abc53.gif
Crom 29, je crois qu'il faut que je te réexplique l'intérêt du contrôle de version Pourquoi garder des vieilles versions inutiles d'un fichier et pas le remplacer
heu... j'ai fait une bêtise?
je suis sur irc si tu veux ^^

Note : la version mysql ne viendra pas avant un petit moment, vu que je dois m'occuper d'une MaJ de mon server ^^
Citation :
Note : la version mysql ne viendra pas avant un petit moment, vu que je dois m'occuper d'une MaJ de mon server ^^
Je n'ai pas menti, 8 mois plus tard la voila :
http://82.235.140.130/download/pw_auth.erf

Pour ceux qui utiliserais encore l'ancienne version, vous pouvez soit la garder, soit la supprimer. En installant la nouvelle, les mots de passe seront réinitialisés.


Installation :
Importer le .erf, deux nouveaux scripts feront leur apparition : pw_auth_inc et gui_pw_auth
Ouvrir pw_auth_inc et lire les 1ères lignes concernant l'installation et la configuration.

Voila un petit résumé de cas lignes :

  • Il faut une table MySQL contenant la liste de tous les comptes (UniqueKey) ainsi qu'une colonne nommée 'password'. Si vous n'avez pas encore de table de ce genre, il y a une fonction à rajouter dans le OnClientEnter du module et une requete SQL a executer (détaillées dans le script)
  • Faire une modif dans le OnPCLoad pour afficher la demande de mdp
  • Créer la table 'authentification' (la requête est dans le script)


Merci de me signaler tout bug(s) !
__________________
http://img.xooimage.com/files21/b/4/0/bann_lcda-500x100-12abc53.gif
Nouvelle faille découverte :

Lorsqu'on se connecte avec un compte connu avec une casse incorrecte (ex: CrOm29 au lieu de Crom29), la BDD Bioware qui est case sensitive sera vierge, alors que l'attribution des personnages qui n'est pas case sensitive sera celle du compte Crom29
Je suis pas sûr que ce soit très clair, mais en gros, suivant comment sont codées les quêtes du serveur, il est possible de les réinitialiser tout en gardant son perso comme avant (XP, gold, carac, ...)

J'ai corrigé les scripts et les ai mis sur GitHub pour l'occasion :
https://github.com/CromFr/NWN2-SQLAuth

Note : Il s'agit de la version fonctionnant avec MySQL, l'autre n'a pas été corrigée
Attention : Si vous utilisiez les scripts ci dessus, il faudra executer le script SQL suivant une seule et unique fois, pour hacher les mots de passe en SHA (plus sécurisé et ethique)
UPDATE `TABLE_ACCOUNT` SET `TABLE_ACCOUNT_COLUMN_PASSWORD` = SHA(`TABLE_ACCOUNT_COLUMN_PASSWORD`) WHERE `TABLE_ACCOUNT_COLUMN_ACCOUNT`!='';
(En remplaçant TABLE_ACCOUNT, TABLE_ACCOUNT_COLUMN_PASSWORD, TABLE_ACCOUNT_COLUMN_ACCOUNT par les noms associés notés dans pw_auth_inc.nss)
Cela aura pour effet de bloquer le joueur à l'entrée du serveur si il mal écrit son nom de compte, et lui indique la bonne casse à utiliser.
__________________
http://img.xooimage.com/files21/b/4/0/bann_lcda-500x100-12abc53.gif

Dernière modification par Crom29 ; 19/11/2012 à 17h19.
Quelques idées en vrac:
- se baser sur l'IP du client pour le nombre d'essai pour éviter le gel d'un compte;
- utiliser un AUTO_INCREMENT dans les tables pour éviter de se baser sur un varchar45 (par principe);
- stocker le password directement en SHA (par principe aussi).

Bon, je cherche la petite bête
Citation :
- se baser sur l'IP du client pour le nombre d'essai pour éviter le gel d'un compte;
le joueur est kické du serveur au bout de 3 essais ratés. Je pense que le fait de refaire la procédure de connexion au serv est assez chiante & longue pour éviter les spammers à la recherche du mdp

Citation :
- utiliser un AUTO_INCREMENT dans les tables pour éviter de se baser sur un varchar45 (par principe);
J'ai utilisé des id naturels sur les tables, parce que c'est ce qu'on utilise sur la colère d'aurile. Je suis d'accord avec toi que des id numériques sont plus performants, mais le jour où j'ai designé la bdd du module, j'ai trouvé qu'utiliser un varchar serait plus facile à utiliser pour les futurs nouveaux scripteurs.

Citation :
- stocker le password directement en SHA (par principe aussi).
C'est fait, cf post juste au dessus

Dernière modification par Crom29 ; 30/11/2012 à 12h09.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés