IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

A propos de $_SERVER['REMOTE_ADDR'];


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut A propos de $_SERVER['REMOTE_ADDR'];
    Bonjour,
    Cette variable globale n'a pas toujours la même forme. Elle peut prendre la forme "2a01:e0a:a84:a70:5c2c:6524:6717:a6c4" ou une forme décimale. J'aimerais l'avoir toujours sous forme décimale (000.000.000.000) et je ne sais pas comment la convertir.

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Il n'y a pas de bijection entre l'ensemble des IPv4 et IPv6. IPv6 peut représenter 3.4E38 adresses IP, alors que IPv4 ne peut en représenter que 4.3E9. Il n'est donc pas toujours possible de convertir une IPv6 en IPv4.

    Qu'est ce que tu cherches à faire?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Grâce à toi, je découvre qu'il existe deux versions d'IP.
    Je souhaite faire des statistiques simples: Je veux savoir combien d'utilisateurs utilisent mon site et leur fréquence d'utilisation.
    Ce que j'ai fait devrait donc suffire car il ne doit pas y avoir d'ambiguïté entre les deux versions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $IP	= $_SERVER['REMOTE_ADDR'];
    $db	= dbConnect();
    $sql	= "INSERT IGNORE INTO dat_visits (address) VALUES('$IP')";
    $db->query($sql);
    if( !$db->lastInsertId() ) {
    	$sql = "UPDATE dat_visits SET counter=(SELECT counter+1) WHERE address='$IP'";
    	$db->query($sql);
    }
    Avec la définition de table suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `dat_visits` (
      `address` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
      `counter` int NOT NULL DEFAULT '1'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
     
    ALTER TABLE `dat_visits`
      ADD PRIMARY KEY (`address`);

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Tu peux aussi la jouer de cette manière:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE dat_visits (
      address BINARY(32) PRIMARY KEY,
      counter INTEGER NOT NULL DEFAULT 1
    ) ENGINE=InnoDB;

    et
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $IP = $_SERVER['REMOTE_ADDR'];
    $db = dbConnect();
     
    $query = 'INSERT INTO dat_visits (address) VALUES (unhex(?))
      ON DUPLICATE KEY UPDATE counter=counter+1';
    $stmt = $db->prepare($query);
    $stmt->execute([hash('sha256', $IP)]);

    De cette manière:
    • Tu évites de stocker des adresses IP en base, ce qui peut être litigieux car considérées comme des données personnelles, et à la place tu stockes juste les empreintes des adresses (on ne peut pas faire la conversion inverse sha256 => chaîne de départ, mais on peut comparer puisqu'une même chaîne produit la même empreinte).
    • Cette empreinte est stockée dans une colonne de type BINARY(32), ce qui un meilleur candidat que le type VARCHAR pour une clef primaire.
    • INSERT INTO ... ON DUPLICATE KEY UPDATE te permet de faire l'opération en une seule requête sans te préoccuper s'il y a déjà une entrée dans ta table.


    NB: Dans ce cas précis, l'utilisation d'une requête préparée n'est pas nécessaire puisque hash('sha256', $IP) ne peut produire qu'une chaîne de caractères hexadécimaux, donc on peut aussi écrire sans risque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $query = "INSERT INTO dat_visits (address)
    VALUES (unhex('" . hash('sha256', $IP) . "'))
      ON DUPLICATE KEY UPDATE counter=counter+1";
    $db->query($query);
    Mais attention à ne pas trop y prendre goût.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci pour ton aide.
    Maintenant, je cherche à convertir à la main les anciennes valeurs pour les mettre à jour dans la table.
    En php, j'ai essayé ceci echo hex2bin( hash('sha256', '2a01:e0a:a84:a70:5c2c:6524:6717:a6c4') ); qui me renvoie des chaînes bizarre (exemple "t�,^�m�6Z)��$V0�/T��\�w�;") quelque soit la version IPv4 ou Ipv6. Je pense qu'il doit y avoir un problème d'encodage ou de lecture binaire.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    La fonction hash a un troisième paramètre qui permet de choisir entre une chaîne de caractères (avec des caractères hexadécimaux) et du binaire. Donc inutile d'utiliser hex2bin.
    Les données binaires brutes ne représentent pas une chaîne de caractères, c'est donc normal d'obtenir des � en cherchant à afficher avec echo.


    Tu n'es pas obligé de faire la conversion chaîne hexadécimale => binaire coté PHP, il suffit d'envoyer la chaîne hexadécimale et d'utiliser la fonction de MySQL unhex() (C'est ce que j'ai fait dans la requête d'insertion).
    Tu peux d'ailleurs faire toute la conversion IP => chaîne hexadécimale => binaire directement avec MySQL en utilisant unhex(sha2(address, 256)).

    Le code d'insertion précédent peut très bien s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $query = 'INSERT INTO dat_visits (address) VALUES (unhex(sha2(?, 256)))
      ON DUPLICATE KEY UPDATE counter=counter+1';
    $stmt = $db->prepare($query);
    $stmt->execute([$IP]);
    en laissant le soin à MySQL d'opérer toutes les conversions pour parvenir à du BINARY(32).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/01/2010, 11h51
  2. Retrouver l'adresse ip .$_SERVER['REMOTE_ADDR']. en perl
    Par itinerairesbis dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 20/09/2009, 15h14
  3. Réponses: 2
    Dernier message: 07/12/2007, 13h12
  4. Réponses: 1
    Dernier message: 12/04/2007, 13h03
  5. $_SERVER['REMOTE_ADDR'] est vide
    Par yakotey dans le forum Apache
    Réponses: 4
    Dernier message: 01/08/2006, 08h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo