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应用防火墙, 前端工具, 安全运维, 自动化攻击, 规则编辑器, 跨平台, 错误基检测, 静态代码分析