重用MySQL解析器

bit*_*mix 7 mysql sql syntax parsing lexical

我正在研究SQL 入侵检测系统(IDS),我需要解析传入的SQL查询.编写自己的SQL解析器是一项长期任务,它永远不会完全反映本机解析器中使用的逻辑.我发现MySQL有一个带有主源文件的词法分析器sql/sql_lex.cc和一个用bison构建的语法分析器sql/sql_yacc.y.我真的很有兴趣重用这个强大的解决方案.我正在用C/C++构建我的IDS,所以我正在寻找一些方法将MySQL解析器与我的检测系统连接起来.

我想知道是否有可能重用MySQL解析器(词法+语法分析器)以某种逻辑形式获得SQL查询的结构,例如语法树.可能吗?是否有一些相关的文字,教程或项目?

谢谢

bit*_*mix 9

我已经完成了我的IDS的第一个版本作为我的学士项目的一部分.它是作为MySQL的插件实现的.

我将列出我理解MySQL内部的主要资料来源.然后我简要介绍一下我在IDS中使用的方法.

MySQL文档文本

  • 我发现书专家的MySQL查尔斯·贝尔了解MySQL内部通过萨沙Pachev(如user3822447写)是非常好的切入点理解的MySQL的内部.
  • MySQL 5.1中插件开发安德鲁·哈钦斯和谢尔盖Golubchik也是非常有用的.
  • MySQL内部手册还包含了一些基本信息,良好的开始.
  • 读完之后我做了som 调试(使用VS)并发现了查询树结构的样子.

我的IDS解决方案

我的解决方案的源代码可以在sourceforge找到.我打算在其wiki中记录更多内容.

主要入口点是audit_ids_notify()函数audit_ids.cc.该插件采用内部MySQL解析器生成的查询树,使其简化版本(以节省内存).然后它进行异常检测 - 它具有已知查询树结构的列表,并保留关于每个查询树结构的每个可参数化部分的一些统计信息.输出将写入MySQL数据目录中的特殊日志文件.

我试图使解决方案模块化和可扩展.初始版本是一种演示,并且性能未得到优化,尤其是在SQL存储模块中.

MySQL插件类型

我确定了两种可能的方法并使用了第一种方法.

  1. 审计插件
    • 我的解决方案插件中的包装器类型是审计插件.
    • 尽管用于报告服务器操作(例如记录查询或错误),我使用了这种类型的插件.
    • 我选择了这种类型的插件,因为我发现这是唯一一个本机支持的插件,当查询树在完成(即解析)之后和从内存中释放之前调用(对于MySQL 5.6.17).
    • 缺点:在MySQL的未来版本中,上述内容并未得到充分保证,但在我看来,这不应该在不久的将来发生变化.
    • 优点:MySQL不需要重新编译.它足以构建和安装插件.


  1. query-rewrite插件
    • 使用非本机插件类型查询重写还有另一种方法.它提供了用于修改查询的插件API,因此也用于读取它.
    • 缺点:要支持此插件API,必须使用API​​重新编译MySQL服务器.我认为可能会成为MySQL生产分发的一部分.
    • 优点:设计用于读取/重写内部查询树的插件类型.

如果有一些与此主题相关的问题/问题我可以随时回答;)