Page 1 sur 2
Sauvegarder Hostname Client
Posté : 08 mars 2021, 17:04
par xstevenetx
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.
Re: Sauvegarder Hostname Client
Posté : 08 mars 2021, 19:09
par or 1
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.
Re: Sauvegarder Hostname Client
Posté : 08 mars 2021, 22:04
par xstevenetx
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
Re: Sauvegarder Hostname Client
Posté : 09 mars 2021, 23:04
par xstevenetx
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
Re: Sauvegarder Hostname Client
Posté : 09 mars 2021, 23:26
par Saian
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. ^^
Re: Sauvegarder Hostname Client
Posté : 10 mars 2021, 00:32
par xstevenetx
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.
Re: Sauvegarder Hostname Client
Posté : 10 mars 2021, 00:45
par Saian
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 ?
Re: Sauvegarder Hostname Client
Posté : 10 mars 2021, 19:22
par xstevenetx
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.
Re: Sauvegarder Hostname Client
Posté : 10 mars 2021, 19:45
par Saian
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é.
Re: Sauvegarder Hostname Client
Posté : 10 mars 2021, 22:07
par xstevenetx
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
Re: Sauvegarder Hostname Client
Posté : 10 mars 2021, 22:24
par Saian
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.
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.

Re: Sauvegarder Hostname Client
Posté : 11 mars 2021, 11:58
par xstevenetx
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
Re: Sauvegarder Hostname Client
Posté : 11 mars 2021, 12:18
par Saian
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
Re: Sauvegarder Hostname Client
Posté : 12 mars 2021, 01:04
par xstevenetx
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
Re: Sauvegarder Hostname Client
Posté : 12 mars 2021, 01:11
par Saian
^^
$filename = date('Y-m-d') . '.txt';