Безопасная база данных sqlite3 только для чтения - PullRequest
7 голосов
/ 17 сентября 2010

Я хочу предоставить пользователям моего сайта произвольный доступ только для чтения к базе данных SQLite3, не позволяя им писать в базу данных или наносить какой-либо другой ущерб.Как?

Создание файла db только для чтения немного помогает, но такие команды, как "ATTACH", ".load" и ".output" позволяют людям читать / записывать другие файлы, которые могут быть не защищены.

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

Я кратко попытался изменитьИсходный код sqlite3 для запрета записи, но это сложнее, чем кажется: даже инструкция SELECT выполняет некоторые внутренние INSERTS / и т. д.

Примечание: Я рассмотрел DOSатакует, и уменьшит время процессора до 5 с или около того.Моя главная проблема - это повреждение файлов / «взлома», а не DOS.

chroot () может работать, но кажется чрезвычайным.

Мысли?

РЕДАКТИРОВАТЬ: Ого, я действительно спрашивал об этом 3+ года назад?

С тех пор Я на самом деле написал программу для этого.

, которая, на мой взгляд, достаточно безопасна (но я могу ошибаться).

Вот пример запроса.

Ответы [ 4 ]

1 голос
/ 11 декабря 2013

Вы не упомянули, как вы предоставляете доступ к базе данных SQLite.

Если вы делаете это через C API (например, пишите CGI в C, который принимает необработанный SQL-запрос, передает его в sqlite, а затем возвращает все, что было возвращено), тогда команды с точкой, такие как ".load"не имеют значения.Они реализованы программой оболочки sqlite3 и не будут работать при непосредственном вызове функций C API.

В этом случае вы можете вызвать sqlite3_open_v2 , передав SQLITE_OPEN_READONLY как единое целоефлагов, чтобы предотвратить запись базы данных.

Команду ATTACH можно отключить, вызвав sqlite3_limit (), чтобы установить для SQLITE_LIMIT_ATTACHED значение 1, чтобы предотвратить успешное подключение второй базы данных.Поскольку оператор DETACH «отсоединяет дополнительное подключение к базе данных, ранее присоединенное с помощью оператора ATTACH», звучит так, что это не позволит отсоединить исходную базу данных, чтобы обойти это ограничение.

Насколько далекокак я могу видеть из анализа SQL, понятного для SQLite , это должно закрыть все дыры.Возможно, вы захотите пробежаться по прагме с расческой с мелкими зубами, просто чтобы убедиться, что если я что-то пропустил, дайте мне знать, и я обновлю этот ответ.

1 голос
/ 17 сентября 2010

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

Есть ли у васРассматривается использование белого списка вместо черного?Разрешить только те операторы, которые начинаются с SELECT или EXPLAIN.

0 голосов
/ 28 сентября 2010

Сделайте файл базы данных доступным только для чтения в операционной системе.Как только вы это сделаете, SQLite не сможет переопределить его.Если у вас все еще есть проблемы, это не проблема SQLite.Возможно, им все еще удастся найти проблему с php / cgi / etc, но это характер зверя безопасности.

0 голосов
/ 28 сентября 2010

Убедитесь, что у вашего пользователя есть права на запись, а у других пользователей (особенно у пользователя, с которого работает веб-сервер) есть доступ только на чтение к самому файлу. Как вы это сделаете, конечно, зависит от вашей платформы (Linux, Windows и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...