howto: Adminer + sqlite + login-ip.php (Как заставить это работать по-человечески)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
kasak
Сообщения: 899
ОС: OpenBSD

howto: Adminer + sqlite + login-ip.php

Сообщение kasak »

Привет. Я хотел бы оставить это послание для тех, кому зачем-то понадобился веб-админ для sqlite.
Всего таких решений два:
  1. phpliteadmin заброшенный
  2. adminer, недавно воскресший (на момент написания, 2025 год)
adminer вполне юзабелен, но относительно именно sqlite есть нюанс - он требует либо "секьюрного айпишника" либо "авторизацию"
и то и другое привинчивается через плагины, но АБСОЛЮТНО НИГДЕ не написано как именно это сделать!

Пришлось покопаться в коде и разобраться, в конце концов, как именно это сделать.
Сначала, около файла 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; и вообще ничего не посылать. Но это уже совсем другая история.
Linux kasak-pc 6.17.8-arch1-1 #1 SMP PREEMPT_DYNAMIC Fri, 14 Nov 2025 06:54:20 +0000 x86_64 GNU/Linux
Спасибо сказали: