exemt/modsecEditor

GitHub: exemt/modsecEditor

一款基于浏览器的 ModSecurity 规则编辑器,通过语法高亮、可视化构造器、70 余项语义诊断和示例验证,帮助用户编写出不仅在语法上正确、而且实际行为符合预期的 WAF 规则。

Stars: 0 | Forks: 0

# ModSecurity 规则编辑器 基于浏览器的 ModSecurity 规则编辑器:提供语法高亮、可视化的 `SecRule` 构造器 以及能够解释规则为何无效的语义检查。 **演示:** https://exemt.github.io/modsecEditor/ 所有计算均在客户端完成:没有服务器,也不会将配置上传到任何地方。 ## 为什么需要它 规则在语法上的正确性几乎不能保证任何事。`SecRule` 可以顺利 加载,然后默默地永远不触发——因为 `t:lowercase` 与 `@streq POST` 连在一起,因为选择了 `phase:1` 来检查请求体,因为 `deny` 与 `nolog` 搭配使用,导致没人知道它是否触发过。 编辑器回答的问题不是“这能不能加载”,而是“它是否实现了 用户所意图的功能”。 ## 功能特性 **文本选项卡。** 提供语法高亮、行号、光标下关键字的悬浮提示,以及 OWASP CRS 风格的规则逐行格式化。 帮助信息分为两个级别:鼠标悬停时显示单行简介,按住 Alt 时显示完整文章, 包含语法、技术属性、常见陷阱、示例和相关关键字列表。 **可视化构造器。** 将规则视为表单:检查区域、转换流水线、 操作符和动作。替换列表具备上下文感知能力——例如,对于 `REQUEST_HEADERS` 应该建议哪些选择器,`setvar` 包含哪些变量。该选项卡仅适用于 能够成功编译的规则:假装构造器能够理解 有语法错误的文本,还不如坦诚地表示不支持。 **诊断。** 超过 70 项检查,分为三个严重级别: - `error` — ModSecurity 将拒绝加载该规则; - `warning` — 能够加载,但行为不符合预期:例如永远不会触发、始终触发 或遗漏了部分输入; - `advice` — 行为与字面意思完全一致,但有更简单、代价更低或更可靠的实现方式。 另一个独立的维度是消息的主题——结构、逻辑、覆盖率、环境、 日志记录、性能、风格等——这样可以屏蔽整类 警告,而不是逐一处理。 **示例验证。** 在每个条件下,都会展开一个用于输入示例值的字段。 流水线会真实地作用于该值——像 ModSecurity 那样一步一步、 逐字节地进行处理——并在操作符旁边显示是否匹配。关于 `t:lowercase` 紧挨着 `@streq POST` 意味着检查永远不会触发的警告,可能 被认为是吹毛求疵;但在输入的 `POST` 下方显示 `post` 结果却是不争的事实。对于散列(hash)以及少数仅在 引擎源码中定义了行为的转换,编辑器根本不会显示结果:相比于显示一个看似合理但不准确的值,留空单元格显然更诚实。 **快速修复。** 如果是机械性的错误,消息旁边会出现一个按钮: 将参数转换为所需的大小写、将 `@rx` 替换为 `@contains`、将 `t:none` 移至流水线开头、恢复日志记录等。修复操作被定义为模型转换,而不仅仅是 文本修改,因此它既不依赖于源码的格式化方式,也不受触发该操作所在选项卡的影响。这里刻意不支持有歧义的修复:与其去猜测规则作者的意图,不如 不猜测,这样代价更小。 **示例和语言。** 提供预制规则(bad bot、SQLi、XSS、rate limit、链式规则等),界面支持 英语和俄语。 ## 快速开始 ``` npm install npm run dev # дев-сервер Vite npm run build # прод-сборка в dist/ npm run preview # локальный просмотр собранного npm test # jest, 308 тестов npm run lint # oxlint ``` 需要 Node.js 20.19+ 或 22.12+。 ## 设计架构 核心逻辑(`src/modsec/`)不依赖于 React,并且独立于界面进行了充分的测试。 | 模块 | 作用 | | --- | --- | | `parser.ts` | 宽容的配置解析器:将文本转换为对象树。遇到未知指令不会报错 | | `types.ts` | 包含源码行范围(spans)的已解析文件对象模型 | | `compile.ts` | 从已解析的文档构建构造器模型,并处理导致无法构建的错误 | | `model.ts` | 基于表单(而非文本)视角的规则模型 | | `emit.ts` / `serialize.ts` | 将模型反向序列化为 ModSecurity 文本 | | `format.ts` | 以 OWASP CRS 风格对规则进行逐行排版 | | `semantics.ts` | 知识库表:变量类型、操作符接受的参数、转换操作的具体行为 | | `checks.ts` | 基于三个可见级别的语义检查:条件、规则、文件 | | `transform.ts` | 将 `t:` 逐字节应用于值——这正是示例验证中所展示的过程 | | `match.ts` | 判断操作符是否会在特定值上触发;对于依赖于环境的操作符,则无法给出确切答案 | | `diagnostics.ts` | 诊断信息目录:每个代码的级别和主题仅定义一次 | | `fixes.ts` | 作为纯模型转换的快速修复功能 | | `suggestions.ts` / `choices.ts` | 上下文提示和选择列表 | | `quoting.ts` | 处理选择器和动作中的引号与转义 | 往返一致性保证:`compile(parse(emit(rule)))` 会生成相同的规则模型——你可以 在任意选项卡中修改文本并无缝切换,不会造成任何数据丢失。 界面采用 React 19 和 MUI 构建:`components/RuleEditor.tsx`(文本)、`components/builder/` (构造器)、`components/diagnostics/`(消息提示)、`i18n/`(多语言翻译)。 关键字相关的知识库与语法高亮逻辑放在一起:`components/syntax/modsecKeywords.ts` 包含 简短描述和正则表达式列表,`components/syntax/details/` 包含扩展文章, 编辑器在按住 Alt 时会展开这些内容。这两部分内容均原生支持双语。 ## 状态 这是一个学习和研究性质的项目,而非商业产品。目前所有的操作均在浏览器内存中针对单个规则文件进行; 不支持从 CRS 仓库导入,也不支持保存到服务器。 ## 许可证 [PolyForm Noncommercial License 1.0.0](LICENSE) — 允许任何非商业 使用:包括个人使用、学习、研究,以及非商业组织和政府机构的使用。商业 使用需要获得单独授权。这不是 OSI 批准的开源许可证。
标签:AppImage, ModSecurity, PB级数据处理, WAF, Web应用防火墙, 前端工具, 安全运维, 自动化攻击, 规则编辑器, 跨平台, 错误基检测, 静态代码分析