[PHP] o [APACHE] - Filtro geo per accesso sito

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
Ciao,

non ho ben capito dove postare questa discussione; se a livello di web server oppure di sviluppo sito.
La mia necessità primaria è quella di limitare l'accesso ad un sito web solo a indirizzi IP o nazioni che decido io, tramite identificazione indirizzo ip utente.
So benissimo che si possono usare proxy, vpn e tanto altro per 'apparire' con un altro IP, ma questo, per ora non mi interessa. Quello che voglio capire e se si può fare, in che modo, e nel caso se avete idea di possibili "costi" in termini di prestazioni.

Grazie
 

macus_adi

Utente Attivo
5 Dic 2017
1.128
64
48
IT/SW
Ciao, prova questo si basa su un servizio gratuito per un massimo di 10000 chiamate l'ora....
PHP:
/**
 * Created by PhpS.
 * User: Marco A.
 * Date: 23/02/2018
 * Time: 08:05
 */


class Geocode{

    /**
     * Indirizzo Servizio
     * @var string
     */
    private $service='http://freegeoip.net/json/';

    /**
     * Indirizzo IP Client
     * @var string
     */
    private $ip_request='0.0.0.0';

    /**
     * Dcodifica Risposta
     * @var array
     */
    private $response=[];

    /**
     * Codice stati abilitati a visualizzare il contenuto X
     * @var array
     */
    private $state_enable=['IT'];


    public function __construct()
    {
        $this->ip_request=$_SERVER['REMOTE_ADDR'];
    }


    /**
     * Inizializza la richiesta
     * @return $this
     */
    public function init_(){
        if($this->ip_request!='0.0.0.0')$this->response=json_decode(file_get_contents($this->service.$this->ip_request));
        $this->model_response();
        return $this;
    }

    /**
     * Funzione per effettuare il match per visualizzare lo stato in or out dell'utente nell'applicazione
     * @return bool
     */
    public function check_permision(){
        if($this->response->country_code!=NULL && in_array($this->response->country_code,$this->state_enable))return TRUE;
        else return FALSE;
    }


    private function model_response(){
        $model=['ip','country_code','country_name','regione_code','region_name','city','zip_code','time_cone','latitude','longitude','metro_code'];
        if(empty($this->response)){
            $this->response=new stdClass();
            foreach ($model as $items){
                $this->response->$items=NULL;
            }
        }
    }




    public function get_country(){
        return $this->response->country_code;
    }
    public function get_country_name(){

        return $this->response->country_name;
    }
    public function get_regione_code(){
        return $this->response->region_code;
    }
    public function get_region_name(){
        return $this->response->region_name;
    }


    public function free_param($param='country_code'){
        return $this->response->$param;
    }

}
Per usarlo basta richiamarlo così
PHP:
$geo=new Geocode();
if($geo->init_()->check_permision()){
    //utente abilitato

}else{
    //utente non abilitato
}
Dimenticavo se lo testi in locale ricordati che il tuo ind. ip sarà 127.0.0.1 quindi la lib non funziona... quindi per testarlo in local nella __construct inserisci il tuo indirizzo manualmente
Spero sia utile
 
Ultima modifica:

mr.x

Utente Attivo
9 Apr 2016
234
23
28
.. Quello che voglio capire e se si può fare, in che modo, e nel caso se avete idea di possibili "costi" in termini di prestazioni.

Grazie
Ciao, dipende dache accesso hai alla macchina.
puoi farlo attraverso firewall, es. con iptables; tramite direttive apache, nella configurazione (anche a livello vhost in caso di più siti sullo stesso server) o tramite .htaccess; tramite script , es. php.
In termini di prestazioni prima metti il blocco e meglio è, ad esempio se blocchi tramite firewall le richieste non passano ad apache che non deve quindi elaborarle.
 

MaryDB

Nuovo Utente
23 Nov 2017
17
0
1
Grazie Macus_adi e Mr.x,

un paio di domande/chiarimenti :
@mr.x
Se dovessi utilizzare il firewall/iptables, è certamente un buon metodo di filtro a monte, ma dovrei inserire una quantità di reti notevole (appesantendo il firewall stesso) e soprattutto io devo limitare l'accesso ad uno specifico sito e sulla macchina ce ne sono altri che non devono avere questa limitazione

@macus_adi
lo script che hai riportato, può gestire anche più di una nazione in "allow" ? Il limite delle 10.000 è abbastanza alto (per ora), quindi mi va bene. Almeno posso testare la sua bontà di funzionamento. Tu hai avuto modo di provarlo ?
 

mr.x

Utente Attivo
9 Apr 2016
234
23
28
Grazie Macus_adi e Mr.x,

un paio di domande/chiarimenti :
@mr.x
Se dovessi utilizzare il firewall/iptables, è certamente un buon metodo di filtro a monte, ma dovrei inserire una quantità di reti notevole (appesantendo il firewall stesso)
Puoi anche inserire solo i range che devono avere accesso..
e soprattutto io devo limitare l'accesso ad uno specifico sito e sulla macchina ce ne sono altri che non devono avere questa limitazione
in questo caso potresti agire sulla configurazione apache.

Personalmente utilizzo i 2 metodi insieme su alcuni server, es. tramite firewall mi blocco il traffico cinese e tramite direttive apache filtro il traffico per i virtualhost, ad esempio per il sito della parrucchiera italiana permetto chiamate POST solo dall' Italia (improbabile che una persona dall'inghilterra voglia inviare una preotazione tramite form), e ciò non compromette le prenotazione per il ristorante alle Canarie che riceve per lo più prenotazioni dall'inghilterra.
 

macus_adi

Utente Attivo
5 Dic 2017
1.128
64
48
IT/SW
lo script che hai riportato, può gestire anche più di una nazione in "allow" ? Il limite delle 10.000 è abbastanza alto (per ora), quindi mi va bene. Almeno posso testare la sua bontà di funzionamento. Tu hai avuto modo di provarlo ?
Lo script accetta un qualsiasi array con all'interno i codici di nazione... L'ho inserito anche tra gli snippet.... Se hai problemi è una lib mia, quindi so esattamente cosa fa....
https://forum.mrwebmaster.it/threads/classe-php-per-la-geolocalizzazione-del-visitatore.50841/
Ti consiglio di utilizzare questa che è ottimizzata e commentata....
 

Damiano_

Nuovo Utente
31 Mag 2019
3
0
1
Italy
Ciao,ci sono database di IP gratuiti e a pagamento,non meno di 15€/mese,io ne prenderei uno gratuito ,lo riassumerei in
un file csv,e farei fare la script allow|deny in PHP in Bulgaria, poche decine di euro;)( forse ce l'hanno già pronta):)