Есть ли простой способ сравнить IP-адреса в PHP? - PullRequest
0 голосов
/ 12 февраля 2019

С одной стороны, у меня есть IP-адрес типа 123.3.2.3, и я хотел бы сравнить его с массивом разрешенных IP-адресов, таких как:

$allowedIps = ['123.*.*.*', '123.3.2.3', '123.3.2.3::1', '123.3.*.3']

В этом случае он должен соответствовать всем элементам.

Есть ли простой способ сделать это без создания сложного алгоритма сравнения строк?

1 Ответ

0 голосов
/ 12 февраля 2019

Если вы не собираетесь использовать подстановочные знаки в качестве 123.3.2*.3, которые будут соответствовать любому IP от 123.3.20.3 до 123.3.29.3, тогда приведенное ниже решение будет работать нормально.

Зацикливание на IP-адресах в массиве, и если в нем есть подстановочный знак, создайте два новых IP-адреса - один, где подстановочный знак * заменяется на 0, другой заменяется на 255. Это нижнийи верхний предел.Затем вы преобразуете его в целое число вместо IP-строки, используя функцию ip2long().Делайте это как с самим IP, так и со значением в массиве, когда вы их зацикливаете.

Тогда нужно только сравнить их, чтобы они фактически находились между верхним и нижним пределом.

Если в строке нет подстановочных знаков, сделайте прямое сравнение.

$allowedIps = ['123.2.*.*', '123.3.2.3', '123.3.*.3'];
$IP = '123.3.1.3';
$match = 0;

foreach ($allowedIps as $allowed) {
    // If there is no wildcard, we check for the specific IP instead, and not a range
    if (strpos($allowed, "*") !== false) {
        $lowest = str_replace("*", "0", $allowed);
        $highest = str_replace("*", "255", $allowed);

        if (ip2long($IP) >= ip2long($lowest) && ip2long($IP) <= ip2long($highest)) {
            echo "$IP matched $allowed";
            $match = 1;
            break;
        }
    } elseif (ip2long($IP) === ip2long($allowed)) {
        echo "Matched ".$allowed;
        $match = 1;
        break;
    }
}

Вероятно, даже не понадобится условие для проверки наличия подстановочных знаков, поскольку оно ничего не заменит, и оба условия в последующем условии if будут истинными.

Справедливое предупреждение , я не полностью проверил это, и могут быть некоторые неясные случаи, когда условия могут не работать.Возможно, вам лучше сделать это и вне PHP.

...