stone-rhino/wge

GitHub: stone-rhino/wge

WGE是一款基于C++的高性能Web应用防火墙库,用于提升网络安全防护能力。

Stars: 100 | Forks: 6

# WGE

![GitHub License](https://img.shields.io/github/license/stone-rhino/wge) ![GitHub Tag](https://img.shields.io/github/v/tag/stone-rhino/wge) ![GitHub Repo Size](https://img.shields.io/github/repo-size/stone-rhino/wge) [![Deploy Hugo site to GitHub Pages](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/2494cc3c13104704.svg)](https://github.com/stone-rhino/wge/actions/workflows/hugo-docs.yml) 英文 | [简体中文](README_ZH.md) ## 什么是WGE? WGE是一个基于C++的高性能Web应用防火墙(WAF)库。它已在商业产品Stone Rhino - Web Governance Engine(SR-WGE)中得到成功应用。它设计为与OWASP核心规则集(CRS)兼容,可以用作ModSecurity的替代品。该库使用C++23构建,旨在快速、高效且易于使用。 ## 性能比较 CPU: Intel(R) Core(TM) i5-10400 CPU @ 2.90GHz 2.90 GHz RAM: 32GB OS: Ubuntu 20.04.6 LTS (5.15.153.1-microsoft-standard-WSL2) 工作线程: 8 输入: [白名单请求](benchmarks/test_data/white.data) 和 [黑名单请求](benchmarks/test_data/black.data) | 测试用例 | 启用内存池(TCMalloc) | ModSecurity | WGE | |-------------------|------------------------------|------------|------------| | CRS v4.3.0 | No | 4010 QPS | 17560 QPS | | CRS v4.3.0 | Yes | 4927 QPS | 18864 QPS | 基准测试结果表明,WGE比ModSecurity快得多,性能提升了4倍以上。这得益于现代C++特性的使用以及出色的架构设计和实现。该库设计为易于使用和集成到现有应用程序中,是希望为项目添加WAF功能的开发者的绝佳选择。 ## 功能 * 完全兼容OWASP核心规则集(CRS)。支持所有变量、运算符和操作,确保与现有规则集兼容。有效检测和防御CRS支持的所有攻击类型,包括SQL注入(SQLI)、跨站脚本(XSS)、本地文件包含(LFI)和远程命令执行(RCE)。 * 高性能。使用Antlr4实现高性能前端解析器,精心设计的有效C++对象图作为后端解释器,并集成TCMalloc内存池,显著提高吞吐量并减少内存碎片。 * 丰富的解码支持。使用Ragel实现高性能DFA解码引擎,支持22种常见解码格式,包括URL解码、HTML实体解码、JavaScript解码、CSS解码等,确保攻击有效载荷无法通过编码转换绕过检测。 * 多线程支持。无锁设计支持在多线程环境中的高效操作,适用于高并发场景。 * SecLang++。从SecLang衍生而来,SecLang++引入了各种实用语言特性,如规则片段、配置驱动规则、条件操作、别名和引用变量,增强了规则编写的灵活性和可维护性。 ## 未来计划 * 持续演进SecLang++,引入更多现代编程语言特性,同时保持领域特定语言的简洁性和易用性,提高规则编写的表达性和可维护性。 * 添加对流式处理的支撑,允许处理大型请求/响应体,而无需将整个内容加载到内存中,减少内存使用并防止大型请求体攻击。 * 添加语法和语义引擎,以减少误报并提高对复杂攻击的检测。 * 引入机器学习辅助检测,以增强对未知攻击的识别。 * 添加多模式匹配检测引擎,以进一步提高规则执行效率。 * 使用字节码+JIT技术最大化规则执行效率。 * 扩展更多连接器,以展示与更多Web服务器和框架的无缝集成。 ## 快速开始 ### 前置条件 * CMake 3.28或更高版本 https://cmake.org/download/ * 已安装cmake的vcpkg https://github.com/microsoft/vcpkg * 兼容C++23的编译器(GCC 13.1或更高版本) https://gcc.gnu.org/ * Ragel 6.10 ``` apt install ragel ``` * JDK 21或更高版本 ``` apt install openjdk-21-jdk-headless ``` * ANTLR4 4.13.2或更高版本 ``` cd /usr/local/lib curl -O https://www.antlr.org/download/antlr-4.13.2-complete.jar ``` * 配置环境变量。将以下内容添加到`/etc/profile`: ``` export CLASSPATH=".:/usr/local/lib/antlr-4.13.2-complete.jar:$CLASSPATH" alias antlr4='java -Xmx500M -cp "/usr/local/lib/antlr-4.13.2-complete.jar:$CLASSPATH" org.antlr.v4.Tool' alias grun='java -Xmx500M -cp "/usr/local/lib/antlr-4.13.2-complete.jar:$CLASSPATH" org.antlr.v4.gui.TestRig' ``` ### 构建 * 更新子模块 ``` git submodule update --init ``` * 配置cmake ``` cmake --preset=release-with-debug-info --fresh ``` 如果编译器路径不在默认路径中,我们可以将`CMakeUserPresets.json.example`复制到`CMakeUserPresets.json`,并在`CMakeUserPresets.json`文件中修改编译器路径: ``` { "name": "my-release-with-debug-info", "inherits": "release-with-debug-info", "environment": { "CC": "/usr/local/bin/gcc", "CXX": "/usr/local/bin/g++", "LD_LIBRARY_PATH": "/usr/local/lib64" } } ``` 然后我们可以运行cmake命令: ``` cmake --preset=my-release-with-debug-info --fresh ``` 如果我们想启用有助于我们观察WGE过程的调试日志,我们可以将`WGE_LOG_ACTIVE_LEVEL`设置为1。 ``` cmake --preset=release-with-debug-info --fresh -DWGE_LOG_ACTIVE_LEVEL=1 ``` `WGE_LOG_ACTIVE_LEVEL`是一个编译时选项,用于控制日志级别: 1: 跟踪 2: 调试 3: 信息 4: 警告 5: 错误 6: 严重 7: 关闭 * 使用cmake构建 ``` cmake --build build/release-with-debug-info ``` ### 运行单元测试 ``` ./build/release-with-debug-info/test/test ``` ### 运行基准测试 ``` ./build/release-with-debug-info/benchmarks/wge/wge_benchmark ``` ### 集成到现有项目 * 安装WGE ``` cmake --install build/release-with-debug-info ``` 安装后,WGE库和头文件将可用在系统包含和库路径中。我们还可以通过指定`--prefix`选项将WGE安装到另一个路径。例如,要将WGE安装到`/specified/path`,我们可以运行: ``` cmake --install build/release-with-debug-info --prefix /specified/path ``` * 在现有项目中包含WGE ``` #include ``` * 在现有项目中链接WGE ``` # 系统路径中安装的 WGE target_link_libraries(your_target_name PRIVATE wge) # 指定路径中安装的 WGE target_link_libraries(your_target_name PRIVATE /specified/path/lib/libwge.a) ``` * 在现有项目中使用WGE 1. 在主线程中构建一个WGE引擎 ``` Wge::Engine engine(spdlog::level::off); ``` 2. 在主线程中加载规则 ``` std::expected result = engine.loadFromFile(rule_file); if (!result.has_value()) { // Handle the error std::cout << "Load rules error: " << result.error() << std::endl; } ``` 3. 在主线程中初始化引擎 ``` engine.init(); ``` 4. 在工作线程中创建每个请求的事务 ``` // Each request has its own transaction Wge::TransactionPtr t = engine.makeTransaction(); ``` 5. 在工作线程中处理请求 ``` // Process each transaction is following the flowing steps // 1. Process the connection t->processConnection(/*params*/); // 2. Process the URI t->processUri(/*params*/); // 3. Process the request headers t->processRequestHeaders(/*params*/); // 4. Process the request body t->processRequestBody(/*params*/); // 5. Process the response headers t->processResponseHeaders(/*params*/); // 6. Process the response body t->processResponseBody(/*params*/); ``` 有关使用示例,请参阅[wge_benchmark](benchmarks/wge/main.cc)。 ## 许可证 版权所有 (c) 2024-2026 Stone Rhino及贡献者。 WGE遵循MIT许可证分发。请参阅附带的[LICENSE](LICENSE)文件以获取详细信息。 ## 文档 - 文档网站:[https://stone-rhino.github.io/wge](https://stone-rhino.github.io/wge/) 我们正在为WGE编写文档。在此期间,请参考`WGE-Connectors`项目中的源代码和示例,了解如何使用该库。 - [WGE-Connectors](https://github.com/stone-rhino/wge-connectors): 集成WGE与各种Web服务器和框架的连接器集合。 ## 贡献 我们欢迎对WGE的贡献!如果您有任何想法、建议或错误报告,请打开GitHub上的问题或提交拉取请求。在贡献之前,请阅读我们的[CONTRIBUTING](CONTRIBUTING.md)指南。 ## 联系 [Stone Rhino](https://www.srhino.com/)
标签:Bash脚本, C++, C++23, CRS, ModSecurity, SOC Prime, WAF, Web 应用防火墙, 开发工具, 开源, 性能优化, 性能测试, 数据擦除, 检测绕过, 系统架构, 网络安全, 软件性能, 防火墙库, 隐私保护, 集成