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

Discussione in 'PHP' iniziata da MaryDB, 22 Febbraio 2018.

  1. MaryDB

    MaryDB Nuovo Utente

    Registrato:
    23 Novembre 2017
    Messaggi:
    17
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    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
     
  2. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    882
    Mi Piace Ricevuti:
    49
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    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: 23 Febbraio 2018
  3. mr.x

    mr.x Utente Attivo

    Registrato:
    9 Aprile 2016
    Messaggi:
    207
    Mi Piace Ricevuti:
    22
    Punteggio:
    28
    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.
     
  4. MaryDB

    MaryDB Nuovo Utente

    Registrato:
    23 Novembre 2017
    Messaggi:
    17
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    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 ?
     
  5. mr.x

    mr.x Utente Attivo

    Registrato:
    9 Aprile 2016
    Messaggi:
    207
    Mi Piace Ricevuti:
    22
    Punteggio:
    28
    Puoi anche inserire solo i range che devono avere accesso..
    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.
     
  6. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    882
    Mi Piace Ricevuti:
    49
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    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....
     
  7. Damiano_

    Damiano_ Nuovo Utente

    Registrato:
    31 Maggio 2019
    Messaggi:
    3
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Località:
    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):)
     
Sto caricando...

Condividi questa Pagina