2016-05-13 10 views
0

Ich habe eine Liste von IP-Bereichen wieSpiel eine weiße Liste von IP-Adressen in PHP

$whitelist=array('50*','202.16*','123.168*','); 

ich nicht sehen die Seite alle anderen Datenverkehr blockieren möchten.

Ich habe

versucht
if(in_array($_SERVER['REMOTE_ADDR'],$whitelist)){ 
    //display page 
    } 
+0

so was ist "funktioniert nicht? –

+0

Besucher von genehmigten IP-Adressen sehen die Seite nicht – mustacheMcGee

+0

Ich habe etwas ähnliches zuvor mit Erfolg verwendet. Zuerst müssen Sie ihre Serveradresse '$ ip = $ _SERVER ['REMOTE_ADDR'];' dann explodieren auf Punkten, und es zu einem '$ if' zuweisen und gegen $' if' und schwarz/weiß-Liste überprüfen. –

Antwort

3

in_array verwendet nicht regexs zu vergleichen. Auch Ihre Regex ist falsch die * ist ein Quantifizierer. Das erlaubt Null oder mehr des vorherigen Charakters.

Versuchen:

$whitelist=array('50\..*','202\.16\..*','123\.168\..*'); 
if(preg_match('/^(' . implode('|', $whitelist) . ')/', $_SERVER['REMOTE_ADDR'])){ 

Die .* ist alles erlaubt (ziemlich viel (siehe s Modifikator http://php.net/manual/en/reference.pcre.pattern.modifiers.php), . ist jedes Zeichen und dann mit diesem quantifier zuvor erwähnten gepaart).
Die ^ ist der Anfang der Zeichenfolge.
\. ist ein Literal ..
Die | ist ein oder.

Demo: https://eval.in/571019
Regex Demo: https://regex101.com/r/dC5uI0/1

+0

Ich fange an zu denken, dass ich das ersetzen sollte, das ich mit diesem benutzt habe * lol * Es ist viel mehr robust. –

+0

@ Fred-ii- was war/ist deins? – chris85

+0

Mine ist nach einem Kommentar, den ich unter der OP-Frage verließ. Es verwendet '{$ var [0]}. {$ Var [1]}. {$ Var [2]}' explodiert von der Serveradresse und prüft dann, ob es von einem Array existiert, ist aber ineffizient, wenn es darum geht, zu suchen das erste Element, da ich entweder das Array reduzieren oder hinzufügen müsste. Es funktioniert, aber Ihre Methode ist viel einfacher zu arbeiten. –

1

Dies sollte für Sie arbeiten:

Sie Schleife durch weiße Liste IP und Raumverkleidung und * (wenn von rechts zu finden).

Dort nach substr können Sie die IP-Adresse der gleichen Länge der Whitelist IP in Schleife schneiden, und beide zu vergleichen.

$whitelists = array('50*','202.16*','123.168*'); 
foreach($whitelists as $whitelist){ 
    $whitelist = rtrim($whitelist, "*\r\n\t\0 "); 
    if(substr($_SERVER['REMOTE_ADDR'], 0, strlen($whitelist)) == $whitelist) { 
     $match = true; 
     break; 
    } 
} 
echo $match ? 'Match' : 'Not Match'; 
1

wie angegeben von @ chris85, in_array nicht regexs verwenden.

, so etwas zu tun, könnten Sie einfach eine Schleife wie folgt verwenden:

if(preg_match('/^(' . implode('|', $whitelist) . ')/i', $_SERVER['REMOTE_ADDR'])){ 
// Do your stuff 

} 

Ihr ‚*‘ funktioniert nicht, wie Sie .. dachte Das ist ok:

$whitelist=array('50\.*','202.16\.*','123.168\.*'); 
+2

also warum die doppelte Antwort und Piggy-Backing auf Chris 'Antwort? Alles was ich sehe, ist das hinzugefügte "i". –

Verwandte Themen