Eine optimierte Methode zum Vergleichen von IP-Adressen mit Platzhaltern in PHP?

8

Wer weiß, eine effektive und sichere Methode, um zu sehen, ob diese Eingabe:

%Vor%

stimmt mit etwas überein, das diesem Array inkonsistenter Filter ähnelt (beachte, dass 200.100. *. * nur als 200.100. * ausgedrückt werden kann) mit Platzhaltern, die durch * 's:

angezeigt werden %Vor%

Aktualisieren

Gedanken?

%Vor%     
Kirk Ouimet 30.09.2011, 15:58
quelle

5 Antworten

8

Ich habe dies nicht benchmarkiert, aber ich würde mich dafür entscheiden, die Methode zu verwenden, die die Netzwerkhardware / -software verwendet ...

Ersetze irgendeinen * durch 0 und 255. Konvertiere die IPs in Ganzzahlen

Wenn also 255.255.255. * zu 255.255.255.0 und 255.255.255.255 wird Dann funktioniert ip2long auf diesen beiden ips.

Dann können Sie die angegebene IP in lange IP konvertieren. zum Beispiel 255.255.50.51 in lange IP.

Dann können Sie vergleichen, ob die lange IP für diese gegebene IP zwischen den konvertierten langen IPs in der Blacklist ist. Wenn es dann ist, ist es nicht erlaubt, sonst ist es.

%Vor%     
Anush 30.09.2011 18:01
quelle
5

Entfernen Sie die Sternchen und tun Sie einfach:

%Vor%     
webbiedave 30.09.2011 16:08
quelle
2

Dieser erlaubt alle Fälle in der Frage plus kurze Masken ohne Sternchen wie 123.123.

%Vor%     
Victor 15.11.2016 11:07
quelle
1

Warum nicht einfach einen regulären Ausdruck verwenden?

%Vor%     
Peter Smith 30.09.2011 16:02
quelle
0

Nur zum Spaß, ich werde das überbearbeiten. Nun, es sei denn, Sie haben eine ziemlich lange Liste, gegen die Sie sich einigen müssen.

Angenommen, Sie verwenden nur Platzhalter, um "Ich interessiere mich nicht für dieses Oktett", dann können Sie jeden Eintrag in Ihrem Array in vier Werte (einen pro Oktett) parsen. Angenommen, Sie verwenden -1, um Platzhalter zu verwenden, bedeutet 0-255, dass dieser Wert exakt übereinstimmt. (Wenn Sie eine bessere Leistung als O (n) benötigen, wobei n die Größe der Trefferliste ist, dann gibt es hier bessere Datenstrukturen, z. B. einen Trie.) Rufen Sie dieses Array auf Natürlich brauchen Sie das nur einmal - nicht pro Anfrage.

Sie können die entfernte Adresse dann auf die gleiche Weise analysieren (außer ohne Platzhalter). Sie können auch feststellen, dass REMOTE_ADDR nicht im erwarteten Format angezeigt wird. Es wird jetzt ziemlich einfach, Übereinstimmungen zu überprüfen:

%Vor%

(Das ist natürlich Pseudocode)

    
derobert 30.09.2011 16:12
quelle

Tags und Links