Всего таких решений два:
- phpliteadmin заброшенный
- adminer, недавно воскресший (на момент написания, 2025 год)
и то и другое привинчивается через плагины, но АБСОЛЮТНО НИГДЕ не написано как именно это сделать!
Пришлось покопаться в коде и разобраться, в конце концов, как именно это сделать.
Сначала, около файла adminer.php создайте директорию adminer-plugins и положите туда плагин login-ip.php.
Брать тут: https://github.com/vrana/adminer/blob/master/plugins/login-ip.php
После чего, около файла adminer.php создайте файл adminer-plugins.php с таким содержимым:
Код: Выделить всё
<?php
return array(
new AdminerLoginIP( array ( '192.168.0' )),
);Код: Выделить всё
-rw-r--r-- 1 www www 507471 Sep 27 09:58 adminer-5.4.1.php
-rw-r--r-- 1 www www 68 Jul 14 17:48 adminer-plugins.php
lrwxr-xr-x 1 root www 17 Oct 14 18:38 index.php -> adminer-5.4.1.php
adminer-plugins:
total 4
-rw-r--r-- 1 www www 1679 Jul 13 23:04 login-ip.php
файл login-ip.php ожидает получить у себя на входе два массива (хотя бы один) с айпишниками, которые передаёт http заголовок REMOTE_ADDR - первый массив и HTTP_X_FORWARDED_FOR - второй массив.
Первый соответственно, если клиент открывает сервер напрямую, второй - если через реверсивный прокси.
Мы ему передаём массив для сравнения.
Строка, которой он сравнивает выглядит так:
Код: Выделить всё
(strncasecmp($_SERVER["REMOTE_ADDR"], $ip, strlen($ip)) == 0)Он сравнивает строку REMOTE_ADDR со строкой, поступившей из массива $ip. Причём сравнение он обрезает до длины $ip.
Например:
REMOTE_ADDR принимает значение 192.168.0.100
а ip мы ему посылаем 192.168.0
строка обрезается до 19.168.0 и у нас есть совпадение.
А теперь нюансы:
Как вы могли заметить, если указать в массиве например 192.168.0.1, то мы получим совпадение не только с 192.168.0.1, но ещё и с 192.168.0.100-199, поскольку сравнение будет обрезано.
В связи с этим, хочу всё таки добавить, что плагин следует считать лишь затычкой, чтобы adminer перестал жаловаться, а защиту от посторонних следует сделать через ограничения выбранного веб сервера.
Ремарка:
Вся забава в том, что админер на самом деле просто ждёт от функции возврата true.
Если заморочиться, можно заменить весь код функции в плагине на return true; и вообще ничего не посылать. Но это уже совсем другая история.