[RESOLU] Comparation IPv6 avec une base de données

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Comparation IPv6 avec une base de données

Re: Comparation IPv6 avec une base de données

par Couin » 07 nov. 2020, 08:30

Hello,

Bon, ai pu tester, c'est good :)
J'ai mis 2 versions avec une détection de version php pour choisir automatiquement la plus récente du reader, pour le site, et une plus ancienne pour mon serveur sur lequel je dev, afin que ça ne mette pas en carafe par incompréhension de la dernière version.

Merci , au top :)
A la prochaine :D

Re: Comparation IPv6 avec une base de données

par @rthur » 06 nov. 2020, 08:36

Effectivement, tout est contenu dans un fichier, du coup ça facilite aussi les mises à jour.

Re: Comparation IPv6 avec une base de données

par Couin » 05 nov. 2020, 17:06

Hello @rthur
Merci pour ta réponse , je vais regarder ca , mais si en effet il n'y a pas besoin de passer par la DB ca devrait être plus simple du coup !

Re: Comparation IPv6 avec une base de données

par @rthur » 03 nov. 2020, 13:21

Alors je ne connais pas celui-ci, donc je vais un peu botter en touche en te proposant une alternative.

La référence du marché pour ce genre de besoin c'est MaxMind qui a une version gratuite qui fonctionne en IPV4 et IPV6 :
https://dev.maxmind.com/geoip/geoip2/geolite2/

Et voici un exemple d'utilisation en PHP :
https://stackoverflow.com/a/26244493

Comparation IPv6 avec une base de données

par Couin » 03 nov. 2020, 04:02

Hello,

Dans l'admin de mon site, j'ai les IP des visiteurs en "temps réel" (actualisé toutes les 10 secondes , de mémoire).
Par curiosité, je souhaiterais indiquer à coté de chaque IP, quel est le pays du visiteur (oui si il passe par un VPN c'est faussé, masi pas grave), histoire de savoir quels pays s'y intéressent.

Je sais qu'il existe des sites qui permettent d'avoir des infos de ce genre via un API qui retourne un fichier json, seulement pour tous ceux que j’ai regardé, ils sont limités en nombre de hits/minutes pour le service gratuit. J'utilise un de ces API pour des requêtes ponctuelles, mais là avec un truc qui récupères les infos de plusieurs ip toutes les 10 seconde,s je vais me faire kicker au bout de pas longtemps lol

Je compte donc contourner la limitation en utilisant une base de données régulièrement mise à jour, par exemple celle de software77.net.

Pour les IPv4, c'est ok, mais les IPv6, je galère pour le stockage et/ou la comparaison par rapport aux "ranges".

Pour faire la requête, j'ai ceci (simplifié) :

Code : Tout sélectionner

SELECT * FROM geotable LEFT JOIN geocountrycodes ON geocountrycodes.ctry = geotable.ctry WHERE ipfrom <= $ipbin AND ipto >= $ipbin AND iptype = 'IPv6' "
Dans laquelle ipbin est l'IPv6 convertie en binaire.
Les valeurs ipfrom et ipto sont aussi les débuts et fins de plages IPv6 converties en binaire.

Malheureusement, cela ne fonctionne pas car pour que les valeurs binaires puissent rentrer dans la DB, la colonne est au format "Text". (Bien que pourtant ca a l'air de fonctionner avec les IPv6 converties en valeurs décimales, mais aussi stockées dans le même type de colonne).

Je ne parviens pas à stocker sous une forme numérique (apparemment, même BIG INT , la valeur max est sur 64bits). J'ai tenté de splitter la valeur binaire de l'IPv6 en 8 pour stocker dans 8 colonnes BIG INT(64), mais du coup, le CONCAT dans le WHERE ne peut pas aller car les valeurs ne sont pas systématiquement sur 8 digits. Je suis revenu en arrière.

inet6_aton, ah bah pas de pot, il faut MySQL 5.6, or j'ai sur mon "serveur" dev c'est 5.5 (oui je sais, pas dernière version mais la fois où j'ai voulu mettre plus récent ca m'a mis aussi php et apache plus récent et ca m'a planté d'autres vieux scripts :( ).

Du coup je me retrouve un peu à court d'idées.

Si quelqu'un a une piste, je suis preneur :D

Merkouin !!!
Couin