首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重用MySQL解析器

重用MySQL解析器
EN

Stack Overflow用户
提问于 2014-04-13 02:58:50
回答 2查看 2.4K关注 0票数 7

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

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-23 19:36:49

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

我将列出我的主要来源,以了解MySQL内部在下面。然后,我简要地描述了我在IDS中使用的方法。

MySQL文档文本

  • 我发现查尔斯·贝尔( Charles )和萨沙·帕乔夫( Sasha Pachev )的“理解内部构件”( Expert MySQL )和萨沙·帕乔夫(Sasha Pachev)的“理解内部构件”()两本书是理解MySQL内部结构的非常好的切入点。
  • 由Andrew & Sergei编写的MySQL 5.1插件开发也非常有用。
  • MySQL内部设备手册还包含一些好的基本信息。
  • 在阅读完之后,我对进行了调试(使用VS),并发现了查询树结构的样子。

IDS的解决方案

我的解决方案的源代码可以在sourceforge上找到。我打算用它的wiki来记录更多。

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

我试图使解决方案模块化和可扩展。初始版本是一种演示,性能没有优化,特别是在SQL存储模块中。

MySQL插件类型

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

  1. 审计插件
代码语言:javascript
复制
- 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.

  1. 查询-重写插件
    • 还有一种使用非本地插件类型查询重写的替代方法。它编写了用于修改查询的插件API,从而也用于读取查询。
    • 为了支持这个插件API,必须用Disadvantage:重新编译MySQL服务器。我认为可能会成为MySQL生产发行的一部分。
    • Advantage:用于读取/重写内部查询树的插件类型。

如果有一些与这个主题相关的问题/问题,我可以回答,请随意提问;)

票数 9
EN

Stack Overflow用户

发布于 2014-09-14 21:19:54

我相信这是可能的。尝试一本高级的MySQL内嵌书,如查尔斯贝尔的“专家MySQL”或萨沙帕乔夫的“理解MySQL内部”。MySQL使用一个自定义手工构建的lexer和一个与Bison兼容的通用解析器,与其兼容。

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

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

我不是SQL专家,但最基本的策略是使用参数化查询,忽略渗透尝试。互联网上的大多数尝试都是普通的、随机的查询,旨在探测明显的弱点,如果您在任何地方都遵循基本的安全实践,就可以安全地忽略它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23038620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档