重用MySQL解析器

时间:2014-04-13 02:58:51

标签: mysql sql parsing syntax lexical

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

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

由于

2 个答案:

答案 0 :(得分:9)

我已经完成了我的IDS的第一个版本作为我的单身汉项目的一部分。它是作为MySQL的插件实现的。

我将列出我理解MySQL内部的主要资料来源。然后我简要描述了我在IDS中使用的方法。

MySQL文档文本

  • 我发现了 Charles Bell 了解MySQL内部 Sasha Pachev 的书籍 Expert MySQL (正如user3822447所写) )是了解MySQL内部的非常好的切入点。
  • MySQL 5.1插件开发 Andrew Hutchings& Sergei Golubchik 也很有用。
  • MySQL Internals Manual 还包含一些良好的基本信息。
  • 读完之后我做了调试(使用VS)并发现了查询树结构的样子。

我的IDS解决方案

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

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

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

MySQL插件类型

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

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

    1. query-rewrite plugin
      • 还有一种替代方法,可以使用非本机插件类型 query-rewrite 来实现此目的。它提供了用于修改查询的插件API,因此也用于读取它。
      • 缺点:要支持此插件API,必须使用API​​重新编译MySQL服务器。我认为可能会成为MySQL生产分发的一部分。
      • 优势:用于读取/重写内部查询树的插件类型。
    2. 如果有一些与此主题相关的问题/问题,我可以随时回答;)

答案 1 :(得分:1)

我相信这是可能的。尝试使用高级MySQL内部书籍,例如" Expert MySQL"作者:Charles Bell或者#34;了解MySQL内部结构"作者:Sasha Pachev。 MySQL使用自定义手工构造的词法分析器和与其词法分析器兼容的通用Bison兼容解析器。

除此之外,您可能会找到比解析查询更简单的解决方案,例如:

  • 策略#1:丢弃查询,只查看查询中字符串的内容。寻找可能的攻击向量,例如SQL关键字。这可以检测到攻击企图。
  • 策略#2:丢弃所有用户输入并列出其余查询内容。列出所有关键字的查询模式,并将它们相互比较。查找具有异常结构的查询,表明有人成功修改了查询。

我不是SQL大师,但最基本的策略只是使用参数化查询并忽略渗透尝试。互联网上的大多数此类尝试都是通用的随机查询,旨在探测明显的弱点,如果您遵循各地的基本安全实践,可以安全地忽略。