Traceur pour un sondage d'utilisation pour MCF2020

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Traceur pour un sondage d'utilisation pour MCF2020

Message par PhM »

Bonjour,

J'ai fait un programme (MCF2020) qui semble rencontré un "petit succès d'estime" dans la communauté française des simulateurs de vol.

Lors d'une prochaine version et temporairement, j'aimerai inclure un procédé qui me permette de connaitre le nombre de personne qui l'utilise ?

Mais, d'une manière transparente et non intrusive pour l'utilisateur (donc, pas d'email en retour) et pour un seul retour par utilisateur.

Comment feriez-vous cela ?

Philippe
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par Ar-S »

Tu choppes une donnée unique, par exemple, le num de série du DD du PC ou simplement utiliser un ID unique genre:
Debug Computername()+UserName()

Si tu veux savoir le nombre d'USER en temps réel
- A chaque ouverture de soft tu upload un txt du nom Computername()+UserName() dans un dossier dédié en ligne.
- Et le soft, via un timer compte le nombre de fichiers présent.
- En quittant le soft, tu supprimes le fichier.

Si tu veux savoir le nombre d'USER qui ont utilisé ton soft
- Tu fais la même chose sans la suppression du fichier à la fin.



Avantage : pas intrusif
Inconvénient : nécessite un accès ftp uniquement dédié à ça pour des raisons de sécurités.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par Naheulf »

Ar-S a écrit :tu upload un txt du nom Computername()+UserName()
[...]
nécessite un accès ftp
Heu... perso j'ai pas vraiment envie que le nom de mon ordi et de ma session se balade en clair sur internet (via le protocol FTP). À la rigueur, tu fait passer par une fonction de hachage.

Code : Tout sélectionner

EnableExplicit

UseSHA2Fingerprint()
#DemiSel$ = "MCF2020"
Define id$

id$ = ComputerName()+UserName() ; Identifiant en clair
id$ = StringFingerprint(id$+#DemiSel$, #PB_Cipher_SHA2, 512) ; Use SHA2-512 variant
id$ = Right(id$, 8) ; On ne garde qu'une fraction du hash pour mieux l'anonymiser. 
Debug id$
Vu le fonctionnement éponge des sommes de contrôle, bien mettre le sel à fin pour légèrement ralentir les attaques par pré-image en empêchant l'optimisation des étapes initiales ("Initial-step optimizations" sur https://hashcat.net/events/p13/js-ocohaaaa.pdf).
Le fait de ne garder qu'un petit extrait du hash le rend un peu plus anonyme en noyant le véritable id dans la multitude des pré-images possibles au détriment de la garantie d'unicité des ids (collisions volontaires).
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par PhM »

Merci à vous deux,

Pas mal le cryptage tronqué.

Par contre, je n'ai pas bien compris comment id$ repartait vers l'extérieur d'une manière "discrète" ?
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par Naheulf »

PhM a écrit :Pas mal le cryptage tronqué.
À la réflexion, je pense qu'il vaudrait mieux faire le CRC32 du hash au lieu de transmettre un hash partiel. Comme ça il n'y a plus aucun moyen de savoir à quoi ressemblais le hash de départ.
PhM a écrit :Par contre, je n'ai pas bien compris comment id$ repartait vers l'extérieur d'une manière "discrète" ?
Il y a discret et anonymisé. Le but de ma manip n'est pas d'être discret mais anonymisé pour respecter au mieux la vie privée.
:!: Il s'agit ci dessous des signification que j'estime correctes. Ce n'est pas forcément le cas :!:
- Discret : personne ne sais que j'ai transmis l'info. Mais si on récupère ce qui a été transmis on peut retrouver les données d'origine.
- Anonyme : tout le monde sais que l'info à été transmise mais personne ne peut retrouver les données d'origine. (Hormis par force brute, et encore)

Dans notre cas tu peut utiliser une connexion FTP simple non sécurisé comme l'as proposé Ar-S pour transmettre l'info en clair puisque elle est anonymisée et donc rendue inexploitable pour récupérer des informations sensibles.

Après il y a toujours le problème des métadonnées. Si un ordinateur se connecte à ton FTP, on peut supposer qu'il utilise ton logiciel. Mais à un moment donnée faut arrêter d'être parano. Car hormi en passant par TOR, I2P ou autre (ce qui risque d'exciter les antivirus) ce genre d'information fuira toujours.
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par PhM »

Bonjour,
Si je comprends bien, je dois me référer au groupe de commandes décrites dans l'aide PureBasic - Ftp ?
Pour que le programme se connecte avec les bons identifiant et mot de passe.
Nouveau monde pour moi...

Je suis chez Orange donc quelque chose comme cela :

Code : Tout sélectionner

  InitNetwork()
  
  If OpenFTP(0, "perso-ftp.orange.fr", "mon-email", "mon_mot de passe")
    Debug "Connecté avec succès à ftp.orange.fr"
  Else
    Debug "Impossible de se connecter à ftp.orange.fr"
  EndIf
  
  CloseFTP(0)
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par Marc56 »

:!: :arrow: ...en faisant cela tu mets dans ton code ton login et mdp de site (qui est aussi celui qui sert à charger les pages si tu utilise celui de ton hébergeur)
Et même si tu le crypte dans le code, il devient visisble lors de la connexion puisque le FTP d'Orange n'est pas crypté.

Si tu veux faire des stats de connexions, utilise un compteur externe ou héberge chez quelqu'un qui te donne accès au log de ton site ou qui propose un langage dynamique (ex: PHP) et une base SQL. (free.fr te fait ça gratuit (base PHP, MySQL et PostgreSQL, mais pas accès au log. Le tout avec des version un peu périmées et sans support technique, mais le tout fonctionne quand même)

:wink:
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par PhM »

De toute manière, pour le moment, ce code ne fonctionne pas ?
Alors, qu'avec FileZilla, je me connecte avec le même identifiant et le même mot de passe !
C'est mal parti...

Cela ne fonctionne pas, non plus avec : If OpenFTP(0, "ftp://perso-ftp.orange.fr", "identifiant", "passe")
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par Marc56 »

Il semble que ça ait changé depuis quelques temps

A partir du 21/05/2019, choisissez l'option de chiffrement FTP explicite sur TLS (en mode passif uniquement).

Donc pas possible avec PB pour l'instant. :(
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par PhM »

Marc56 a écrit :Donc pas possible avec PB pour l'instant. :(
Bonjour Marc,
Ah, très bien, je comprends mieux.
Bon, pour l'instant, je laisse tomber ma "curiosité statistique"...
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par Naheulf »

Comme l'as proposé Marc56, vu que tu as ton propre site, tu peut aussi faire des requêtes http et gérer ça en php.


Dans ton logiciel tu utilises des requêtes HTTP normales :

Code : Tout sélectionner

DeclareModule Stats
	Declare Init()
	Declare OnStart()
	Declare OnStop()
EndDeclareModule

Module Stats
	EnableExplicit
	
	#BASE_URL = "http://127.0.0.1/forums/purebasic/SondageMCF2020/stats.php?"
	
	Define id$
	NewMap Header$()
	
	Declare$ _ComputeId()
	Declare$ _StatsRequest(action$, id$="")
	
	Procedure Init()
		Shared id$, Header$()
		
		InitNetwork()
		UseSHA2Fingerprint()
		UseCRC32Fingerprint()
		
		id$ = _ComputeId()
		Header$("User-Agent") = "MCF2020"
	EndProcedure
	
	Procedure OnStart()
		Shared id$
		_StatsRequest("start", id$)
	EndProcedure
	
	Procedure OnStop()
		Shared id$
		_StatsRequest("stop", id$)
	EndProcedure
	
	Procedure$ _ComputeId()
		#DemiSel$ = "MCF2020"
		Define id$
		
		id$ = ComputerName()+UserName() ; Identifiant en clair
		id$ = StringFingerprint(id$+#DemiSel$, #PB_Cipher_SHA2, 512) ; Use SHA2-512 variant
		id$ = StringFingerprint(id$, #PB_Cipher_CRC32)				 ; On passe par CRC32 pour rendre impossible la recherche
		ProcedureReturn id$
	EndProcedure
	
	Procedure$ _StatsRequest(action$, id$="")
		Shared Header$()
		Protected HttpRequest = HTTPRequest(#PB_HTTP_Get, #BASE_URL + "action="+action$+"&id="+id$, "", 0, Header$())
		If HttpRequest
			Debug "Status: " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
			Debug "Réponse: " + HTTPInfo(HTTPRequest, #PB_HTTP_Response)
			
			FinishHTTP(HTTPRequest)
		Else
			Debug "La requête a échoué"
		EndIf
	EndProcedure
EndModule

CompilerIf #PB_Compiler_IsMainFile
	Stats::Init()
	Stats::OnStart()
	Delay(10000)
	Stats::OnStop()
CompilerEndIf
Et sur le serveur tu peut y mettre ce script :

Code : Tout sélectionner

<?php
// On désactive la mise en cache dans les proxys
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé

$action = isset($_GET['action']) ? $_GET['action'] : "";
$id     = isset($_GET['id']) ? $_GET['id'] : "";
$client = $_SERVER["HTTP_USER_AGENT"];

// On fait quelques vérifications sur l'id
If (!preg_match("/[0-9a-f]{8}/", $id))
{
	// Problème détecté on annule tout
	$id = "";
}

// Idem sur l'action
$action = strtolower($action);
If ($action != isset($_GET['action']) ? $_GET['action'] : "")
{
	$action = ""; // Problème détecté on annule tout
}

// Si on veut, ont peut aussi vérifier que la requête à bien été émise par ton logiciel
If ($client <> "MCF2020")
{
	$client = "";
}

If ($action == "start" and $id != "" and $client <> "")
{
	fclose(fopen("./active_ids/".$id, 'w')); // Fichier pour le nombre actuel d'utilisateurs
	fclose(fopen("./all_ids/".$id, 'w'));    // Fichier pour le nombre total d'utilisateurs
	echo "start";
}
elseif ($action == "stop" and $id != "" and $client <> "")
{
	If (file_exists("./active_ids/".$id)){
		unlink("./active_ids/".$id);
	}
	echo "stop";
}
elseif ($action == "stats" and $id == "")
{
	$active = -2; $total = -2; // On décompte les entrées "." et ".."
	if ($dh = opendir("./active_ids/")) {
		while (($file = readdir($dh)) !== false) {
			$active += 1;
		}
		closedir($dh);
	}
	
	if ($dh = opendir("./all_ids/")) {
		while (($file = readdir($dh)) !== false) {
			$total += 1;
		}
		closedir($dh);
	}

	header('Content-Type: text/plain');
	echo "Utilisateurs actifs : ", $active, "\n";
	echo "Utilisateurs total  : ", $total,  "\n";
}
else
{
	header('HTTP/1.0 500 Internal Server Error');
	header('Content-Type: text/plain');
	echo "erreur";
}
Quelques remarques :
- Pense bien à adapter la constante #BASE_URL à ton serveur
- J'ai fait un filtrage par User-Agent mais tu peut le désactiver
- Le script PHP à besoin que les dossiers "active_ids" et "all_ids" soient déjà crées
- Si tu met juste "action=stats" le serveur te retourne le nombre d'utilisateur actuellement actifs et le nombre d'utilisateurs total
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Traceur pour un sondage d'utilisation pour MCF2020

Message par PhM »

Bonjour et merci Naheulf,
je viens juste de découvrir ton travail.
Je vais essayer de comprendre tout cela et je te tiens au courant.
Répondre