[RESOLU] Sauvegarder Hostname Client

Eléphanteau du PHP | 25 Messages

08 mars 2021, 17:04

Bonjour,

J'aimerais sauvegarder le hostname et l'IP des machines qui se connecte à mon site.
J'ai trouvé un bout de code qui fonctionne uniquement pour les IP.
J'ai essayé de rajouter une ligne pour le hostname, mais sans succes.
A la place il ne me redonne l'adresse IP.

Code : Tout sélectionner

<?php $date = date("d/m/Y")." ".date("H:i") ; $filename = 'IPVisiteur.txt'; $nameserv = gethostbyaddr($_SERVER['REMOTE_ADDR']); if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $somecontent=$_SERVER['HTTP_X_FORWARDED_FOR']; else $somecontent=$_SERVER['REMOTE_ADDR']; if (is_writable($filename)) { if (!$handle = fopen($filename, 'a')) { exit; } if (fwrite($handle, $date.' '.$somecontent.' '.$nameserv."\r\n") === FALSE) { exit; } fclose($handle); } else { } ?>
Donc il me sauvegarde bien dans mon fichier, la date, l'heure et l'adresse IP du client mais aprés impossible de trouver pour le hostname.
Avec un simple "ping -a" dans une invite de commande, j'obtiens bien le hostname.
J'arrive à avoir le hostname de la machine serveur, mais cela ne m'interesse pas.

Merci de votre aide.

Mammouth du PHP | 2703 Messages

08 mars 2021, 19:09

https://www.php.net/manual/fr/function. ... byaddr.php
Retourne le nom de l'hôte en cas de succès, l'ip non modifiée en cas d'échec ou false si une entrée mal formée est fournie.

si cela retourne l'ip pour toutes les ip testées, c'est que le serveur doit être configuré pour ne pas retourner le hostname.

Eléphanteau du PHP | 25 Messages

08 mars 2021, 22:04

Merci de ta réponse.
J'ai accès et je peux modifier des choses dans le serveur.
Donc si tu sais comment modifier le serveur apache pour qu'il puisse retourner le hostname cela m’intéresse.

Merci d'avance

Eléphanteau du PHP | 25 Messages

09 mars 2021, 23:04

Bonjour,
Petite nouveauté, j'ai remarqué que le script fonctionne quand je suis dans le réseau directement de mon entreprise.
Mais quand je suis en "extérieur" avec un VPN, il me donne uniquement l'adresse IP, se qui ne m’intéresse pas vraiment.

Si quelqu'un a une solution.
Merci

Avatar du membre
Mammouth du PHP | 1609 Messages

09 mars 2021, 23:26

Salut, peut être un problème de DNS qui doit changer selon que tu es en locale ou sur le VPN ? je suis pas expert réseaux alors pas taper hein. ^^
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

10 mars 2021, 00:32

Certainement que tu as raison, mais est-il possible de contourner le problème?
Même en VPN, si je fais un "ping -a IP" en CMD j'obtiens bien le hostname.

Avatar du membre
Mammouth du PHP | 1609 Messages

10 mars 2021, 00:45

Non je saurai pas trop dire. Peut être qu'un outil de DNS lookup pourrait t'aider à comprendre ? mais concrètement je ne saurai pas te dire quoi faire. C'est peut être tout simplement pas solutionnable ?
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

10 mars 2021, 19:22

Une solution temporaire que j'aimerais faire :
Faire une base de données à coter en CSV avec le nom de la personne et a coter son Hostname.
EX:
Hostname;Nom
PC-De-Bureau1;Steven

Une fois relier ensemble il me dirait directement sur le mon fichier de log, à coter du hostname le nom de la personne.
EX: 10/03/2021 13:07 192.168.0.12 PC-De-Bureau1 Steven

Et si il n'y a pas de correspondance, me donner la première ligne d'un ping en -a :
EX: Envoi d'une requête 'ping' sur PC-De-Bureau2 [192.168.0.15] avec 32 octets de données

Merci d'avance.

Avatar du membre
Mammouth du PHP | 1609 Messages

10 mars 2021, 19:45

C'est pas bête comme idée. Quitte à stocker ça dans un fichier, j'utiliserai plutôt un array sérialisé (serialize/unserialize) ou converti en json (json_encode/json_decode) et à priori plutôt le json si besoin de pouvoir le lire ou y ajouter des entrées manuellement.

file_get_contents et file_put_contents feront très bien l'affaire pour écrire et lire le fichier.

Après si tu es amené à avoir beaucoup d'adresses dans le fichier peut être un fichier csv serait plus approprié mais le processus de lecture et d'écriture sera un peu plus complexe. Et dans ce cas une base de données serait encore mieux.

Sinon sqlite peut être une solution pour faire une base de données sans serveur mais j'ai jamais essayé.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

10 mars 2021, 22:07

Je suis vraiment débutant, et tout se que tu me dis est très beau mais je vais galérer à le mètre en place.
Donc si tu peux m'aider.

Merci

Avatar du membre
Mammouth du PHP | 1609 Messages

10 mars 2021, 22:24

Enregistrer les données dans un fichier en json ça n'a vraiment rien de galère ou de compliqué, au contraire.

// enregistrer les données
$ipToHost = [
  '127.0.0.1' => 'localhost',// juste un exemple
  // etc
];
file_put_contents('ip-to-host.json', json_encode($ipToHost));

// lire les données
$ip = '127.0.0.1';
$ipToHost = json_decode(file_get_contents('ip-to-host.json'));
$hostname = $ipToHost[$ip] ?? $ip;

Tu peux alimenter le tableaux autant de fois que tu veux avant de l'enregistrer sous format json dans le fichier et inversement, tu peux chercher autant d'ip que tu veux dedans après en avoir récupérer le contenu une fois.

EDIT

Je m'ennuyais un peu alors voilà. J'ai pas testé le code alors y a peut être des erreurs.

<?php

// date et somecontent

$date = date('d/m/Y H:i');
$somecontent = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];

// nameserv, lecture et écriture du fichier ip-to-host.json

// charge les ip du fichier ip-to-host.json si il existe sinon crée un tableau vide
$ipToHost = file_exists('ip-to-host.json')
  ? json_decode(file_get_contents('ip-to-host.json'))
  : [];

// essaie de récupérer le host dans les données enregistrées
$ip = $_SERVER['REMOTE_ADDR'];
$nameserv = $ipToHost[$ip] ?? $ip;

// si le host n'est pas trouvé dans les données du fichier, tente de le récupérer avec gethostbyaddr
if ($nameserv == $ip) {
  $nameserv = gethostbyaddr($ip);

  // si un nouveau host est trouvé, l'ajoute au tableau et met à jour (ou créé) le fichier ip-to-host.json
  if ($nameserv != $ip) {
    $ipToHost[$ip] = $nameserv;
    file_put_contents('ip-to-host.json', json_encode($ipToHost));
  }
}

// écriture des données dans le fichier IPVisiteur.txt

$filename = 'IPVisiteur.txt';
if (is_writable($filename)) {
  if (!$handle = fopen($filename, 'a')) {
    exit;
  }
  if (fwrite($handle, $date.' '.$somecontent.' '.$nameserv."\r\n") === FALSE) {
    exit;
  }
  fclose($handle);
}
Ça fera 25€ pour la demi heure. :mrgreen:

PS : pas besoin de fermer la balise php quand y a que du php dans le fichier.

PPS : on a tous été débutant un jour et le mieux pour apprendre c'est la doc, ses exemples, les recherches google et surtout essayer. :wink:
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

11 mars 2021, 11:58

Merci de ta réponse.
J'ai essayer ton code et il fonctionne uniquement 1fois, je m'explique : Quand je le lance il me crée bien le .json et le rempli, après le fichier IPVisiteur.txt est bien rempli également.
Mais si je recommence l'opération il me donne une erreur :
ncaught Error: Cannot use object of type stdClass as array in C:\xampp\htdocs\index.php:355 Stack trace: #0 {main} thrown in C:\xampp\htdocs\index.php on line 355
Qui correspond à la ligne "$nameserv = $ipToHost[$ip] ?? $ip;"
Mais si je vide le .json tout refonctionne, mais uniquement 1 seule fois.

Merci

Avatar du membre
Mammouth du PHP | 1609 Messages

11 mars 2021, 12:18

Salut, il suffit de mettre un true en deuxième paramètre du json_decode pour qu'il retourne la chaîne json sous forme d'un array php.
json_decode(file_get_contents('ip-to-host.json'), true)
Sinon effectivement ça retourne un objet au lieu de retourner un tableau associatif, d'où le "Cannot use object of type stdClass as array". Car effectivement on essaie de manipuler $ipToHost comme un array $ipToHost[$ip] et que le json_decode a retourné un objet de type stdClass pour standard class qui est la classe objet par défaut de php.
https://www.php.net/manual/fr/function.json-decode.php
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 25 Messages

12 mars 2021, 01:04

Super Merci beaucoup sa fonctionne a merveille.
Dernière question est-il possible de changer
$filename = 'IPVisiteur.txt';
et de mettre la date du jour à la place de "IPVisiteur".

Merci

Avatar du membre
Mammouth du PHP | 1609 Messages

12 mars 2021, 01:11

^^
$filename = date('Y-m-d') . '.txt';
Développeur web depuis + de 20 ans