我正在处理SQL 入侵检测系统(IDS),我需要解析传入的SQL查询。编写自己的SQL解析器是一项长期任务,它永远不会准确地反映本机解析器中使用的逻辑。我发现MySQL有一个包含主源文件sql/sql_lex.cc的词法分析器和一个由sql/sql_yacc.y构建的语法分析器。我真的很有兴趣重用这个健壮的解决方案。我正在用C/C++构建我的入侵检测系统,所以我正在寻找一些方法将MySQL解析器与我的检测系统连接起来。
我想知道是否可以重用MySQL解析器(lexical+syntax分析器),以某种逻辑形式(例如语法树)获得SQL的结构。有可能吗?是否有相关的文本、教程或项目?
谢谢
发布于 2014-10-23 19:36:49
作为我单身汉项目的一部分,我已经完成了IDS的第一个版本。它是作为MySQL插件实现的。
我将列出我的主要来源,以了解MySQL内部在下面。然后,我简要地描述了我在IDS中使用的方法。
MySQL文档文本
IDS的解决方案
我的解决方案的源代码可以在sourceforge上找到。我打算用它的wiki来记录更多。
主要入口点是audit_ids_notify()函数在audit_ids.cc中。该插件采用内部MySQL解析器生成的查询树,对其进行简化(以节省内存)。然后进行异常检测--它有一个已知查询树结构的列表,并保存关于每个查询树结构中每个可参数化部分的统计信息。输出被写入MySQL数据目录中的特殊日志文件。
我试图使解决方案模块化和可扩展。初始版本是一种演示,性能没有优化,特别是在SQL存储模块中。
MySQL插件类型
我确定了两种可能的方法,并使用了第一种方法。
- The type of wrapper in my solution plugin is [**audit plugin**](http://dev.mysql.com/doc/refman/5.6/en/audit-plugins.html).
- I used this type of plugins despite being used to report server operations (e.g. to log queries or errors).
- I chose this type of plugin because I found out that this is the only native supported plugin which is called when the query tree is after the completed (i.e. parsed) and before it is freed from the memory (for MySQL 5.6.17).
- **Disadvantage**: the above is not fully guaranteed in future versions of MySQL, but in my opinion this shouldn't change in the close future.
- **Advantage**: the MySQL does not need to recompiled. It is enough to build and install the plugin.
如果有一些与这个主题相关的问题/问题,我可以回答,请随意提问;)
发布于 2014-09-14 21:19:54
我相信这是可能的。尝试一本高级的MySQL内嵌书,如查尔斯贝尔的“专家MySQL”或萨沙帕乔夫的“理解MySQL内部”。MySQL使用一个自定义手工构建的lexer和一个与Bison兼容的通用解析器,与其兼容。
除此之外,您可能会发现一个比解析查询更简单的解决方案,例如:
我不是SQL专家,但最基本的策略是使用参数化查询,忽略渗透尝试。互联网上的大多数尝试都是普通的、随机的查询,旨在探测明显的弱点,如果您在任何地方都遵循基本的安全实践,就可以安全地忽略它。
https://stackoverflow.com/questions/23038620
复制相似问题