Abbinamento con IP CIDR Notation In PHP

A volte non riesci a trovare una risposta, non importa quanto duramente Google. Mi considero fortunato ad aver trovato la risposta!

Il problema: Avete una lista di intervalli di indirizzi IP in notazione CIDR. È necessario prendere in visita IP e valutare se sono all'interno di questa lista di indirizzi consentiti. E, bisogna farlo in PHP.

La risposta: Caricare l'elenco CIDR in una matrice e valutare ogni IP in visita con la seguente funzione (che si trova qui ) ...

  funzione IPFilter ($ ip) ( 
  $ source = array ("10.0.0.0 / 8",
 "192.168.1.1/32",
 "127.0.0.0 / 8"); 
 foreach ($ $ line come fonte) (/ / Ottiene la base ed i bit dalla lista CIDR ($ base, $ bit) = explode ('/', $ line); / / Ora è diviso in lista è classi ( a, $ b $, $ c, $ d) = $ esplodere ('.', base); / / Ora, fare un po 'po' spostando / commutazione per convertire in int $ i = ($ a <<24) + ($ b <<16) + ($ c <<8) + $ d; maschera $ = $ bit == 0?  0: (~ 0 <<(32 - $ bit)) / / Ecco la nostra più bassi int $ basso = $ i & maschera $ / / Ecco la nostra più alta int $ elevato = $ i | (~ $ maschera & 0xFFFFFFFF); / / Ora dividere l'ip che stiamo controllando contro un massimo in lista di classi ($ a, $ b, $ c, $ d) = explode ('.', $ ip); / / ora convertire l'ip che stiamo controllando contro un int controllare $ a = ($ a <<24) + ($ b <<16) + ($ c <<8) + d $ / / Se l'IP è all'interno della gamma, tra cui più alta / valori più bassi, / / allora è witin la gamma CIDR if ($> check = $ a basso & & <$ check = $ altezza) (return 1;) 
  ) 
  return 0; 

)

E 'efficiente? Non lo so. Funziona? Sì è così. E thats più di quanto posso dire su altre soluzioni a questo problema che ho trovato ( qui e altrove).

Condividi questa:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • MySpace
  • Netvibes
  • Reddit
  • Slashdot
  • Technorati
  • Twitter
Lascia un commento

2 Commenti.

  1. Vorrei poter-lo come il mio, ma il codice ei commenti sono entrambi dal sito di Zend. Ho postato questo solo per rendere più facile per le persone a trovare la soluzione. Contento ha aiutato!

  2. Grazie per la funzione eccellente, Bill! Ho anche provato alcune funzioni da http://www.php.net , alcuni dei quali ho potuto dire che non sempre funziona, e alcuni sembravano gli aspiranti fino a quando li ho provati. Credo che quando tutto il resto non è solo bisogno di tornare alle basi di convertire bitmasks e indirizzi IP. Apprezzo il codice commentato! Troverete questo codice in Tera-WURFL 2.1.1 (TeraWurflWebservice.php) una volta l'ho comunicato!

Lasci una risposta


[Ctrl + Invio]