Die Anforderung kam von einem Betriebs- und Wartungskollegen, eine IP-Filterung für eine PHP-Datei durchzuführen. Es war unpraktisch, den Server direkt zu konfigurieren, daher war es notwendig, die IP direkt am Anfang der PHP-Datei zu filtern.
IP-Filterregeln können die folgenden Formen haben:
1. Vollständige IP-Adresse wie zum Beispiel: 192.168.0.1
2. Ein bestimmtes IP-Segment wie zum Beispiel: 192.168.0.*.
Betrieb und Wartung können die IP-Black- und Whitelist anpassen, die aus mehreren IP-Filterregeln besteht und in einem Array gespeichert ist. Durch das Schreiben von Code wird die IP-Black- und Whitelist-Funktion implementiert. Eine relativ einfache Anforderung.
Implementieren Sie zunächst eine Funktion. Die Funktion besteht darin, festzustellen, ob die IP mit einer IP-Filterregel übereinstimmt:
function ip_test($ip,$iprule){ $ipruleregexp=str_replace('.*','ph',$iprule); $ipruleregexp=preg_quote($ipruleregexp,'/'); $ipruleregexp=str_replace('ph','\.[0-9]{1,3}',$ipruleregexp); if(preg_match('/^'.$ipruleregexp.'$/',$ip)) return true; else return false; }
Nach der Implementierung der Kernfunktion ip_test ist der folgende Prozess viel einfacher, er ist nichts weiter als Eine einfache Durchquerung: Bestimmen Sie für jede Regel in der Liste, ob die aktuell verbundene IP der Regel entspricht, und führen Sie die entsprechenden Schritte aus.
Whitelist, führt weiterhin Vorgänge aus, wenn die IP mindestens eine Regel erfüllt.
Auf diese Weise wird eine einfache, in PHP implementierte IP-Schwarz- und Whitelist-Filterung abgeschlossen. Dieser Blog richtet sich hauptsächlich an diejenigen, deren Hauptgeschäft nicht die Entwicklung ist, z. B. technischer Support, Betrieb und Wartung usw. Da es zu einfach war, wollte ich es zunächst nicht schreiben. Später bedankte sich der Kollege für meine Hilfe und erzählte mir, dass er schon lange im Internet danach gesucht, aber keine passende Lösung gefunden habe . Ich dachte, dass das vielleicht jemand wirklich braucht.
$curr_ip=$_SERVER['REMOTE_ADDR']; $white_list=array(...); //白名单规则 $test_success=false; foreach($white_list as $iprule){ if(ip_test($curr_ip,$iprule)){ $test_success=true; break; } } if(!$test_success) exit('IP not in white list');