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

  • Creatore Discussione Creatore Discussione MaryDB
  • Data di inizio Data di inizio

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
 
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:
.. 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.
 
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 ?
 
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.
 
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.mrw.it/threads/classe-php-per-la-geolocalizzazione-del-visitatore.50841/
Ti consiglio di utilizzare questa che è ottimizzata e commentata....
 
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):)
 

Discussioni simili