Come posso rintracciare gli IP per bloccare utenti malintenzionati?

1

TL; DR: Voglio sapere se devo memorizzare REMOTE-ADDRESS e X-FORWARDED-FOR o REMOTE-ADDRESS o X-FORWARDED-FOR?

Dettagli ...

Ecco alcune teorie per ottenere l'IP dell'utente

Theory1: se non usi un load balancer, usa REMOTE_ADDR . Se si utilizza un servizio di bilanciamento del carico, utilizzare qualsiasi cosa utilizzi. Nel 99% dei casi sembra essere HTTP_X_FORWARDED_FOR . Quindi:

function get_ip_address(){
    $id = '';
    if (isset($_SERVER['REMOTE_ADDR']))
        $ip = $_SERVER['REMOTE_ADDR']; 
    else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    else
        $ip = 'UNKNOWN';
    return $ip;
}

Theory2: ci sono altre informazioni di intestazione HTTP (cioè $_SERVER['HTTP_...] ) che potrebbero contenere l'IP. Quindi:

function get_ip_address(){
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){
        if (array_key_exists($key, $_SERVER) === true){
            foreach (explode(',', $_SERVER[$key]) as $ip){
                $ip = trim($ip); // just to be safe
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
                    return $ip;
                }
            }
        }
    }
}

Theory3: Memorizza entrambi uno di $_SERVER['HTTP_...] e $_SERVER['REMOTE_ADDR'] . Quindi ci sono due variabili:

function get_ip_address(){
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED') as $key){
        if (array_key_exists($key, $_SERVER) === true){
            foreach (explode(',', $_SERVER[$key]) as $ip2){
                $ip2 = trim($ip2); // just to be safe
                if (filter_var($ip2, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
                    $ip1 = $_SERVER['REMOTE_ADDR'];
                    return array($ip2, ip1);
                }
            }
        }
    }
}

Beh, onestamente sono un po 'confuso. Quante colonne (nel database) devo memorizzare l'IP dell'utente? Voglio dire, dovrei memorizzare sia REMOTE_ADDR che HTTP_... ? O solo uno di loro?

In realtà ho una query che inserisce l'IP dell'utente per ogni pagina caricata nel database. Quindi quella query verrà eseguita ogni volta prima del caricamento della pagina. Sicuramente una INSERT query (ogni volta per ogni richiesta e ogni utente) ha un costo. Quindi non voglio che sia inutile. Voglio dire che voglio memorizzare un IP corretto / reale o almeno voglio fare il miglior lavoro che è possibile rilevare l'IP * dell'utente.

* Quando un utente utilizza un proxy come HSS, rilevarlo sarebbe impossibile. Ecco perché ho detto "almeno".

Ok, quale teoria è la migliore?

    
posta Martin AJ 09.07.2016 - 00:16
fonte

1 risposta

1

Devi sapere quali server proxy ti fidi e quali intestazioni considerare attendibili (se ce ne sono) per ciascuno di essi.

Ad esempio, sai che il tuo bilanciamento del carico utilizza X-FORWARDED-FOR così puoi fidarti del valore più a destra che viene fornito al tuo server web in questa intestazione.

Il tuo servizio di bilanciamento del carico dovrà anche sapere di quali IP fidarsi. Ad esempio, può fidarsi di RFC 1918 IP privati. Potresti anche volere che si fidi di determinati IP pubblici se, beh ... se ti fidi di loro.

Se ti fidi di loro, probabilmente vorrai rimuoverli dalla catena di IP che sono candidati alla memorizzazione.

Non appena si raggiunge il primo IP non sicuro nella catena, è necessario memorizzarlo come IP remoto per la connessione. Il motivo è perché chiunque può impostare X-FORWARDED-FOR nella richiesta HTTP. Se questo REMOTE_ADDR non è nel tuo elenco di fiducia per X-FORWARDED-FOR , non hai motivo di fidarti dell'intestazione.

Questo può essere complicato se ti fidi di server Internet arbitrari con diverse intestazioni attendibili per ciascuno.

Quanto sopra è un approccio generico per trovare la connessione effettiva che richiede la tua pagina. Tuttavia, se stai cercando di rintracciare gli utenti malintenzionati, puoi semplicemente raccogliere qualsiasi IP in qualsiasi intestazione e REMOTE_ADDR e quindi archiviare più IP per ciascuna connessione. Quindi se iniziano a fare qualcosa di "cattivo" sul tuo sistema, puoi aggiungere un segno nero su tutti questi IP.

Una volta che sono stati assegnati tanti contrassegni neri, il sistema potrebbe iniziare a bloccare le connessioni con quell'IP in REMOTE_ADDR o in un'intestazione HTTP IP. È necessario essere consapevoli che un utente malintenzionato potrebbe tentare di inserire in una lista nera altri IP in un attacco denial of service. Quindi sei tornato alla mia prima descrizione di fidarmi solo di certi host.

Ovviamente, un determinato utente malintenzionato cambierà sempre host quando sentirà la necessità di attaccare il tuo sistema. per esempio. da Tor, tramite servizi VPN o tramite la loro botnet. È una cosa complicata da realizzare, quindi potresti prendere in considerazione altri metodi per bloccare utenti malintenzionati, ad es. costringendoli a registrarsi con un account prima di utilizzare il sistema che viene verificato tramite SMS. Ciò aggiunge una barriera sufficientemente alta da bloccare tutti tranne gli utenti più determinati.

    
risposta data 11.07.2016 - 16:19
fonte

Leggi altre domande sui tag