Yet another ip remote address function

WRInaute accro
Bonjour

J'ai réparé l'anti-navigateur de mon site.

Voici la fonction fXFgjy7eUzQVMSMtV_address() chargée de calculer l'ip remote brute.

is_reelle_ip($ip) ( ipv4 ou ipv6 ) rend true si $ip n'est ni privée ni réservée ni locale ( celle de mon serveur ), false sinon.

Pourriez-vous me donner des conseils pour l'implémentation de la fonction ci-dessous ?

Par exemple : Quelles sont les variables serveur forgeables à éviter ?

Merci beaucoup de votre side.

Respectueusement.


PHP:
/**
 * Retrieves the best guess of the client's actual IP address.
 * Takes into account numerous HTTP proxy headers due to variations
 * in how different ISPs handle IP addresses in headers between hops.
 */
function fXFgjy7eUzQVMSMtV_address()
{
    // check for shared internet/ISP IP
    if(!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        if(is_reelle_ip($_SERVER['HTTP_CLIENT_IP']))
        {
            return $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    if (!empty($_SERVER['HTTP_FORWARDED']))
    {
        if(strpos($_SERVER['HTTP_FORWARDED'], "," ) !== false)
        {
            $array_ip = explode(",", $_SERVER['HTTP_FORWARDED']);
        }
        else
        {
            $array_ip[0] = $_SERVER['HTTP_FORWARDED'];
        }
        foreach($array_ip as $tmp_ip)
        {
            $tmp_ip = preg_replace("{[\"' \t]+}", "", $tmp_ip);
            if(preg_match("{^for=}i", $tmp_ip))
            {
                $ip = preg_replace("{^for=}i", "", $tmp_ip);
                $ip = preg_replace("{[\"' \t]+}", "", $ip);
                if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false)
                {
                    $ipv6 = correct_ip6(strtolower($ip));
                }
                elseif(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false)
                {
                    $ipv4 = $ip;
                }
                if((isset($ipv4))&&(is_reelle_ip($ipv4)))
                {
                    return($ipv4);
                }
                elseif((isset($ipv6))&&(is_reelle_ip($ipv6)))
                {
                    return($ipv6);
                }
            }
        }
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED']))
    {
        if(is_reelle_ip($_SERVER['HTTP_X_FORWARDED']))
        {
            return $_SERVER['HTTP_X_FORWARDED'];
        }
    }
    // check for IPs passing through proxies
    if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        // check if multiple ips exist in var
        if(strpos($_SERVER['HTTP_X_FORWARDED_FOR'], "," ) !== false)
        {
            $iplist = explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']);
        }
        else
        {
            $iplist[0] = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        foreach ($iplist as $ip)
        {
            if (is_reelle_ip($ip))
            {
                return $ip;
            }
        }
    }
    if(!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
    {
        if(is_reelle_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        {
            return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
        }
    }
    if (!empty($_SERVER['HTTP_FORWARDED_FOR']))
    {
        if(is_reelle_ip($_SERVER['HTTP_FORWARDED_FOR']))
        {
            return $_SERVER['HTTP_FORWARDED_FOR'];
        }
    }
    if (!empty($_SERVER['REMOTE_ADDR']))
    {
        if(is_reelle_ip($_SERVER['REMOTE_ADDR']))
        {
            return $_SERVER['REMOTE_ADDR'];
        }
    }
    return(false);
}
 
WRInaute accro
Bonjour rick38

C'est la bonne question. ;)

Je n'utiilise pour l'adresse ip remote, qu'un hash code à sens unique.

Je n'utilise jamais pour mon site l'ip remote directement.

Pour mon anti-navigateur, j'utilise conjointement ce hash code et un identifiant de session.

Mon problème, est d'avoir un hash code fiable, pour reconnaître les visiteurs bloqués.

Mais, je n'ai aucun moyen de savoir qui est le visiteur, puisque mon hashcode est unidirectionnel.

Respectueusement.


Code:
/*
 * Cette fonction
 * rend le hash code
 * d'algorithme
 * sha256,
 * de l'adresse paramètre.
 */
function hash_ip($ip)
{
        return(hash('sha256', (string)$ip));
}
function get_formatted_ip_address()
{
    $ip = fXFgjy7eUzQVMSMtV_address();
    /*
    * Adresse ipv6,
    * On convertit
    * à la valeur
    * normalisée.
    */
    if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false)
    {
        $ip = correct_ip6($ip);
    }
    if(!validate_ip($ip))
    {
        return(false);
    }
    return $ip;
}
function get_hashed_ip_address()
{
    $ip = get_formatted_ip_address();
    if($ip === false)
    {
        return false;
    }
    return(hash_ip($ip));
}
 
WRInaute accro
Excusez-moi

La CNIL.. n'aime pas celà.

Je ne mémorise pas les ip réelles, seulement les hashcodes unidirectionnels.

Problème simple :

Les en-têtes http qu'utilise la fonction
fXFgjy7eUzQVMSMtV_address() sont parfois modifiables par le visiteur, parfois non.

Je ne sais pas lesquels.

Comment modifier cette fonction, pour la rendre fiable?

Par ailleurs, les autres fonctions sont de mon cru, je peux les fournir.

La fonction is_reelle_ip ( 4 ou 6 ) est correcte, elle rend true si l'ip n'est ni privée ni réservée, ni celle du serveur.

Simple non ?

Respectueusement.
 
WRInaute occasionnel
j'ai essayé de comprendre le code par habitude
Je reconnais que même des étudiants en art plastique qui écriraient le premier programme n'arriveraient pas à rendre une tel source.
Je reconnais que je ne fais pas de PHP sauf si on me force
Mais à vue d'oeil : si ta fonction dite "hash" est "unidirectionnelle" mais ta clef qui a généré tes valeurs dites "hash" est bien fixe :
pour savoir si ton ip est "black listée", tu refais un hash de l'ip visiteur et tu la compare a ta table de hash

Et la cnil est contente, parce que même toi tu n'a pas les adresses ip sauvegardées

Méfie toi de ton réseau interne, une adresse privée ca se forge comme n'importe quelle adresse
 
Haut