我正在研究SQL intrusion detection system (IDS),我需要解析传入的SQL查询。编写自己的SQL解析器是一项长期任务,它永远不会完全反映本机解析器中使用的逻辑。
我发现MySQL有一个带有主源文件sql/sql_lex.cc
的词法分析器和一个用sql/sql_yacc.y
的bison构建的语法分析器。我真的很有兴趣重用这个强大的解决方案。我正在用C / C ++构建我的IDS,所以我正在寻找一些方法将MySQL解析器与我的检测系统连接。
我想知道是否有可能重用MySQL解析器(词法+语法分析器)以某种逻辑形式获得SQL查询的结构,例如语法树。可能吗?是否有一些相关的文字,教程或项目?
由于
答案 0 :(得分:9)
我已经完成了我的IDS的第一个版本作为我的单身汉项目的一部分。它是作为MySQL的插件实现的。
我将列出我理解MySQL内部的主要资料来源。然后我简要描述了我在IDS中使用的方法。
我的解决方案的源代码可以在 sourceforge 找到。我打算在其wiki中记录更多内容。
主要入口点是audit_ids_notify()
中的audit_ids.cc
函数。该插件采用内部MySQL解析器生成的查询树,使其简化版本(以节省内存)。然后它进行异常检测 - 它具有已知查询树结构的列表,并保留关于每个查询树结构的每个可参数化部分的一些统计信息。输出将写入MySQL数据目录中的特殊日志文件。
我试图使解决方案模块化和可扩展。初始版本是一种演示,并且性能未得到优化,尤其是在SQL存储模块中。
我确定了两种可能的方法并使用了第一种方法。
如果有一些与此主题相关的问题/问题,我可以随时回答;)
答案 1 :(得分:1)
我相信这是可能的。尝试使用高级MySQL内部书籍,例如" Expert MySQL"作者:Charles Bell或者#34;了解MySQL内部结构"作者:Sasha Pachev。 MySQL使用自定义手工构造的词法分析器和与其词法分析器兼容的通用Bison兼容解析器。
除此之外,您可能会找到比解析查询更简单的解决方案,例如:
我不是SQL大师,但最基本的策略只是使用参数化查询并忽略渗透尝试。互联网上的大多数此类尝试都是通用的随机查询,旨在探测明显的弱点,如果您遵循各地的基本安全实践,可以安全地忽略。