Лексирование частичного SQL в C # - PullRequest
11 голосов
/ 30 мая 2010

Мне нужно проанализировать частичные SQL-запросы (для инструмента аудита SQL-инъекций). Например

'1' AND 1=1--

Должен разбиваться на токены как

[0] => [SQL_STRING, '1']
[1] => [SQL_AND]
[2] => [SQL_INT, 1]
[3] => [SQL_AND]
[4] => [SQL_INT, 1]
[5] => [SQL_COMMENT]
[6] => [SQL_QUERY_END]

Являются ли они хотя бы лексерами для SQL, на которых я основываюсь, или любыми хорошими инструментами, такими как bison для C # (хотя я бы предпочел не писать свою собственную грамматику, поскольку мне нужно поддерживать большинство, если не всю грамматику MySQL 5) )

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

Кажется, есть несколько хороших парсеров.

В этой статье есть образец с использованием MS Entity Framework:
Синтаксический анализ кода SQL в C #

Похоже, кто-то другой свернул свой собственный и поместил его в Code Project:
http://www.codeproject.com/KB/dotnet/SQL_parser.aspx

Лично я бы пошел с решением Entity Framework, так как оно было создано и поддерживается MS, но, следовательно, оно также, вероятно, тесно связано с SQL Server. Поскольку вы смотрите на MySQL, возможно, вы захотите использовать собственное решение в Code Project, так как я уверен, что вы сможете создавать более индивидуальные решения в соответствии с грамматикой.

Я буду использовать это в ближайшее время (для Oracle, а не MySQL), поэтому, пожалуйста, сообщите сообществу, как работает решение!

UPDATE :
Я просто вернулся к этому и прочитал комментарии ... после дальнейшего размышления я бы действительно рекомендовал ANTLR, так как он поддерживает несколько грамматик. Еще раз, я не использовал это, так что будет приятно услышать, как это сработало, и решать вам.
https://stackoverflow.com/questions/76083/parsing-sql-in-net/76151

1 голос
/ 17 марта 2011

Также может быть какой-то способ использовать полностью проанализированный (Microsoft) T-SQL через выпуски базы данных Visual Studio -

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

http://blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx

...