Повторное использование MySQL parser
Я работаю над SQL система обнаружения вторжений (IDS) и мне нужно проанализировать входящие SQL-запросы. Написание собственного парсера SQL-долгосрочная задача, и она никогда не будет точно отражать логику, используемую в собственном парсере.
Я узнал, что MySQL имеет лексический анализатор с основным исходным файлом sql/sql_lex.cc
и синтаксический анализатор, построенный с помощью bison из sql/sql_yacc.y
. Я действительно заинтересован в повторном использовании этих надежных решений. Я создаю свои идентификаторы на C / C++, поэтому я ищу способ подключения MySQL парсер с моей системой обнаружения.
мне было интересно, можно ли повторно использовать MySQL parser (lexical+syntax analyzer), чтобы получить структуру SQL-запроса в некоторой логической форме, например, синтаксическое дерево. Возможно ли это? Есть ли какой-то связанный текст, учебники или проекты?
спасибо
2 ответов
Я закончил первую версию моих идентификаторов как часть моего холостяцкого проекта. Он реализован как плагин для MySQL.
Я перечислю мои основные источники для понимания MySQL internals ниже. Затем я кратко описываю подход, который я использовал в своих идентификаторах.
тексты документации MySQL
- Я нашел книги Эксперт MySQL by Чарльз Белл и Понимание MySQL Internals by Саша Пачев!--13--> (как писал user3822447), чтобы быть очень хорошей точкой входа для понимания внутренних компонентов MySQL.
- MySQL 5.1 Разработка Плагинов by Эндрю Хатчингз И Сергей Голубчик также очень полезно.
- на MySQL Internals Manual также содержит некоторую основную информацию, хорошую для начала.
- после всего прочитанного я сделал som отладка (используя VS) и обнаружил, как структура дерева запросов выглядит так.
мое решение для IDS
исходный код моего решения можно найти в sourceforge. Я планирую документировать его немного больше в его wiki.
основной точкой входа является на audit_ids.cc
. Плагин принимает дерево запросов, сгенерированное внутренним MySQL parser A делает упрощенную версию (для сохранения памяти). Затем он делает аномальное обнаружение - у него есть список известных структуры дерева запросов и сохраняет некоторую статистическую информацию о каждой параметризуемой части каждой структуры дерева запросов. Выходные данные записываются в специальный файл журнала в каталоге данных MySQL.
Я попытался сделать решение модульным и расширяемым. Начальная версия является своего рода демострацией, и производительность не оптимизирована, особенно в модуле хранения SQL.
MySQL тип плагина
Я определил 2 возможных подхода и использовал первый один.
-
аудит плагин
- тип обертки в моем плагине решения -аудит плагин.
- я использовал этот тип плагинов, несмотря на то, что они используются для отчетов об операциях сервера (например, для регистрации запросов или ошибок).
- Я выбрал этот тип плагина, потому что я узнал, что это единственный поддерживаемый плагин, который вызывается, когда дерево запросов после завершения (т. е. разбирается) и перед тем, как он освободится от памяти (для MySQL 5.6.17).
- минус: вышеизложенное не полностью гарантировано в будущих версиях MySQL, но, на мой взгляд, это не должно измениться в ближайшем будущем.
- преимущество: MySQL не нужно перекомпилировать. Достаточно построить и установить плагин.
-
запрос-переписать плагин
- существует также альтернативный подход, делающий это с использованием неродного типа плагина запрос-переписываем. Он provised API плагинов для изменения запроса, так и для чтения.
- минус: для поддержки этого API плагина сервер MySQL должен быть перекомпилирован с API. Я думаю, что может стать частью дистрибутива MySQL production.
- преимущество: тип плагина предназначен для чтения / перезаписи внутреннее дерево запросов.
Если есть какие-то Вопросы/Проблемы, связанные с этой темой, я мог бы ответить, не стесняйтесь спрашивать ;)
Я считаю, что это возможно. Попробуйте продвинутую книгу MySQL internals, такую как" Expert MySQL "Чарльза Белла или" понимание MySQL Internals " Саши Пачева. MySQL использует пользовательский ручной лексер и общий парсер, совместимый с Bison, с которым совместим их лексер.
помимо этого, вы можете найти более простое решение, чем разбор запроса, например:
- Стратегия #1: отбросьте запрос и просто посмотрите на содержимое строк внутри вопрос. Искать возможных атак, таких как SQL запросам. Это может обнаружить попытки атаки.
- стратегия #2: отбросьте весь пользовательский ввод и составьте список остального содержимого запроса. Составьте список всех шаблонов запросов ключевых слов и сравните их друг с другом. Ищите запросы с аномальной структурой, которые указывают на то, что кто-то успешно изменил запрос.
Я не гуру SQL, но самая основная стратегия-просто использовать параметризованный запросы и игнорировать попытки проникновения. Большинство таких попыток в Интернете являются общими, случайными запросами, предназначенными для поиска очевидной слабости, и могут быть безопасно проигнорированы, если вы будете следовать основной практике безопасности повсюду.