2016-10-05 6 views
1

Мне было интересно, как я могу разобрать SQLIte Query и его токенизировать для того, чтобы получить последствия для будущих записей после выполнения запроса, чтобы иметь возможность устанавливать политики в одной базе данных SQLite ?Анализ кода SQLite C#

До сих пор я создал проект, который принимает модули. И есть одна база данных SQLite. Моя цель - создать контроллер, который будет получать запросы от каждого модуля, и по существу проверить, разрешено ли этому модулю изменять конкретную вещь в базе данных.

Любые идеи о том, как это сделать? Есть ли библиотека для этого или что-то еще? Я много искал, но не нашел решения через 6 месяцев.

+2

Это звучит как проблема XY.Конечно, вопрос _ «Как узнать, какие таблицы и строки SQL-запрос собирается ударить» _ отвечает, но ответ окажется нецелесообразным. Что именно ты пытаешься сделать? Каковы эти «модули» и кто их создает? Есть причина, по которой (например) плагиновые системы выставляют API, а не исходный источник данных. – CodeCaster

+0

Кажется, вы правы. Я был настолько сосредоточен на разборе запросов sql, полностью игнорируя возможность создания api, который мог бы выполнить эту работу. Глупый я думаю. – Devian

+1

Звучит похоже на [authorize callback] (http://www.sqlite.org/c3ref/set_authorizer.html). –

ответ

1

Самый простой способ разбора SQLite-запросов - позволить SQLite запускать их.

Если вы выполните инструкцию SQL с помощью EXPLAIN, вы получите набор результатов, содержащий инструкции виртуальной машины (без, фактически выполняющих запрос). Если вы посмотрите на строки с opcode = 'TableLock', столбец p4 даст вам имя затронутой таблицы.

1

Библиотека? Возможно нет. Программное обеспечение, которое вы хотите, редко существует. Это обычно означает, что вы должны сами построить его или без него.

Что вам нужно

  • анализатор запросов SQL,
  • парсер пользовательских возможностей (которые пользователь может обновлять какие таблицы/столбцы,
  • SQL-анализатор, который может сказать какой пользователь может запускать бит SQL, а какие таблицы/поля SQL модифицирует.

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

0

Чтобы установить политику в базе данных, вы можете использовать Compile-Time Authorization Callback:

в различных точках во время процесса компиляции, так как логика создаются для выполнения различных действий, авторизатор обратного вызова, чтобы увидеть, если таковые действия разрешены. Обратный вызов авторизатора должен возвращать SQLITE_OK, чтобы позволить этому действию SQLITE_IGNORE запретить конкретное действие, но разрешить компиляцию инструкции SQL или SQLITE_DENY, чтобы заставить всю инструкцию SQL отклоняться с ошибкой.
[...]
Авторизатор используется при подготовке операторов SQL из ненадежного источника, чтобы гарантировать, что операторы SQL не будут пытаться получить доступ к данным, которые им не позволяют видеть, или что они не пытаются выполнять вредоносные заявления, которые повредить базу данных.
[...]
Приложения, которые должны обрабатывать SQL из ненадежных источников, могут также рассмотреть вопрос о снижении ограничений ресурсов с использованием sqlite3_limit() и ограничении размера базы данных с использованием PRAGMA в дополнение к использованию авторизатора.

Однако вам необходимо расширить свой драйвер базы данных C#, чтобы сделать этот API доступным.