padosoft/laravel-rebel-ai-guard

GitHub: padosoft/laravel-rebel-ai-guard

Laravel框架下的异常检测与AI安全助手

Stars: 0 | Forks: 0

# Laravel Rebel — AI Guard

Laravel Rebel

Laravel 12|13 PHP 8.3+ PHPStan max Pest 4 AI explains MIT

## 目录 - [它是什么](#what-it-is) - [黄金法则](#the-golden-rule) - [为什么选择这个包](#why-this-package) - [Rebel AI Guard 与替代方案](#rebel-ai-guard-vs-the-alternatives) - [安装](#installation) - [用法](#usage) - [安全说明](#security-notes) - [`.env.example`](#envexample) - [测试与许可](#testing--license) ## 它是什么 两件事,刻意分开: 1. **确定性异常检测** — `AnomalyDetector` 扫描 `rebel_auth_events` 并根据固定、可审计的规则(v0.1.0:OTP 轰炸;更多规则即将推出)开启**异常案例**。 没有任何黑盒决定任何事情。 2. **AI 解释器(可选)** — `AiExplainer` 可以请求您提供的 LLM 为操作员*描述*某个案例。它仅供参考,仅能看到经过净化处理的输入,除非您绑定了 `AiClient`,否则它不会存在。 依赖于 [`padosoft/laravel-rebel-core`](https://github.com/padosoft/laravel-rebel-core)。 ## 黄金法则 AI 绝不会开启、关闭或缓解任何案例。它只是将案例的信号转化为文字。所有采取*行动*的机制都是确定性且可审计的。 ## 为什么选择这个包 | ★ | 内容 | 简而言之 | |---|---|---| | ★★★ | **确定性、可审计的检测** | 案例来自您可以阅读和测试的固定规则——而不是模型的随心所欲。 | | ★★★ | **AI 输入经过净化** | 电子邮件、电话号码、OTP/数字序列(包括 Unicode)以及 Bearer/Basic/JWT/key token 在任何 prompt 离开应用之前都会被清除。 | | ★★★ | **AI 仅供参考 + 抵抗注入** | 系统 prompt 禁止做出决定,并将案例数据视为不透明的(防止 prompt injection)。 | | ★★ | **可选的 AI** | 没有绑定 `AiClient`?检测功能仍然有效;解释器只会返回 null。 | | ★★ | **幂等 + 支持多租户** | 案例通过稳定的键进行去重;重新运行会原地更新;数据行的作用域限制在租户内。 | | ★★ | **自带模型** | 绑定 OpenAI、Anthropic 或基于单方法契约的本地模型。 | ## Rebel AI Guard 与替代方案 | 能力 | **Rebel AI Guard** | Shopify | “AI 欺诈”黑盒 | DIY 日志脚本 | |---|:---:|:---:|:---:|:---:| | 您拥有的确定性、可测试规则 | ✅ | ❌ | ❌ | ➖ | | AI **负责解释**,从不做决定 | ✅ | ❌ | ❌ | 不适用 | | Prompt 净化(不会向 LLM 泄露 PII/机密) | ✅ | ❌ | ❌ | 不适用 | | 抵抗 Prompt 注入的系统 prompt | ✅ | ❌ | ➖ | 不适用 | | 在未配置 AI 的情况下工作 | ✅ | ➖ | ❌ | ✅ | | 幂等、去重的案例 | ✅ | ➖ | ➖ | ❌ | | 基于您自己的审计日志自托管 | ✅ | ❌ | ❌ | ✅ | | 支持多租户 + 原生审计(您的应用) | ✅ | ❌ | ❌ | ❌ | ## 安装 ``` composer require padosoft/laravel-rebel-ai-guard php artisan vendor:publish --tag="rebel-ai-guard-migrations" php artisan migrate ``` ## 用法 **检测会自动运行。** 开箱即用时,该包会安排 `rebel:detect-anomalies` 命令**每小时**运行,因此异常案例会自动出现在您的管理面板中——您无需手动调用检测器。运行频率是完全可配置的(参见[调度](#scheduling))。只需确保 Laravel 的调度程序正在运行(像往常一样,在 cron 中设置为 `* * * * * php artisan schedule:run`)。 您也可以随时手动运行它: ``` php artisan rebel:detect-anomalies # scans the last 1440 min (config default) php artisan rebel:detect-anomalies --lookback=60 # scan only the last hour php artisan rebel:detect-anomalies \ --from="2026-06-01T00:00:00" --to="2026-06-01T06:00:00" # explicit window ``` **或者直接调用检测器**(例如从您自己的 job 中): ``` use Padosoft\Rebel\AiGuard\Detection\AnomalyDetector; $opened = app(AnomalyDetector::class)->detect( now()->subHour(), now(), ); // returns how many cases were opened/updated ``` ### 调度 | 配置键 | 环境变量 | 默认值 | 效果 | |---|---|---|---| | `detect.schedule` | `REBEL_AIGUARD_SCHEDULE` | `true` | 自动注册调度。设置为 `false` 可退出并自行配置。 | | `detect.frequency` | `REBEL_AIGUARD_FREQUENCY` | `hourly` | 调度命令运行的频率。白名单频率名称**或**原始 cron 表达式。 | | `detect.lookback_minutes` | `REBEL_AIGUARD_LOOKBACK` | `1440` | 默认扫描窗口(分钟,结束于“当前时间”)。计划任务会显式传递此参数;手动运行时 `--lookback`/`--from`/`--to` 会覆盖此设置。 | 调度仅在控制台上下文中注册,因此它永远不会影响 HTTP 请求。 **频率**接受白名单频率名称或原始的 5 字段 cron 表达式: - 频率名称:`everyMinute`、`everyTwoMinutes`、`everyThreeMinutes`、`everyFourMinutes`、`everyFiveMinutes`、`everyTenMinutes`、`everyFifteenMinutes`、`everyThirtyMinutes`、`hourly`、`daily`、`weekly`、`monthly`、`quarterly`、`yearly`(不区分大小写)。 - Cron 表达式:任何看起来像 `*/15 * * * *` 的表达式都会通过调度程序的 `->cron()` 应用。只有白名单名称才会作为方法调用——不是有效 cron 表达式的无法识别的值将回退到 `hourly`(绝不调用任意方法)。 ``` REBEL_AIGUARD_FREQUENCY=everyFifteenMinutes # cadence name # REBEL_AIGUARD_FREQUENCY="*/15 9-17 * * 1-5" # 或一个原始 cron(每15分钟,9-17点,周一至周五) ``` #### 在显式窗口(`--from` / `--to`)上运行并模拟 cron `--lookback=` 扫描一个结束于“当前时间”的窗口。如需精确窗口,请传入 ISO-8601 标准的 `--from` 和 `--to`(当两者同时提供时,它们将覆盖 `--lookback`;如果只传入 `--from`,`--to` 默认为“当前时间”)。无效的日期时间——或者 `--to` 不在 `--from` 之后——将打印错误并以非零状态退出。 ``` # 模拟特定过去一小时的每小时 cron 运行: php artisan rebel:detect-anomalies \ --from="2026-06-01T09:00:00" --to="2026-06-01T10:00:00" # 一次性回填一整天: php artisan rebel:detect-anomalies \ --from="2026-06-01T00:00:00" --to="2026-06-02T00:00:00" # 从某个时间点直到“现在”: php artisan rebel:detect-anomalies --from="2026-06-01T00:00:00" ``` 由于计划调用只是简单地运行 `rebel:detect-anomalies --lookback=`,因此使用相同窗口的手动运行与 cron 运行的行为完全相同。 **解释案例**(可选 AI): ``` use Padosoft\Rebel\AiGuard\AiExplainer; use Padosoft\Rebel\AiGuard\Models\AnomalyCase; $explainer = app(AiExplainer::class); $case = AnomalyCase::query()->findOrFail($id); $text = $explainer->explain($case); // null if no AiClient is bound ``` **自带模型** — 实现并绑定该契约: ``` use Padosoft\Rebel\AiGuard\Contracts\AiClient; $this->app->singleton(AiClient::class, MyOpenAiClient::class); ``` ## 安全说明 - **不向 LLM 发送 PII/机密**:`PromptSanitizer` 会在发送前清除电子邮件、电话号码、4 位及以上的数字序列(包括 Unicode),以及 Bearer/Basic/JWT/`sk-`/`ghp_`/`xox*` token。 - **AI 不做决定**:系统 prompt 禁止做出/建议破坏性操作,并指示模型将案例数据视为不透明的(抵抗 prompt injection)。 - **确定性核心**:案例来自固定规则;审计日志本来就只存储经过 HMAC 处理的标识符,因此案例携带的是哈希值,而不是原始 PII。 - **租户作用域、幂等**:重新运行检测器会更新现有案例,而不是重复创建。 ## `.env.example` ``` REBEL_AIGUARD_OTP_BOMBING_THRESHOLD=10 REBEL_AIGUARD_SCHEDULE=true REBEL_AIGUARD_FREQUENCY=hourly REBEL_AIGUARD_LOOKBACK=1440 ``` ## 🔋 开箱即用的高效编码 这个包附带了 **AI 电池(全面预设)**——让您(和您的 AI 代理)能够第一次就正确地进行扩展: - **`CLAUDE.md`** — 简明的 AI 工作指南(目的、约定、架构、如何扩展、完成定义)。纯 Markdown 格式,因此 Claude Code、Cursor、Copilot 和 Codex 都能读取它。 - **`AGENTS.md`** — 代理/工作流契约(分支 → PR → CI → 标签/发布,即各项把关)。 - **`.claude/skills/`** — 可调用的技能(至少包含 `rebel-package-dev`),编码了套件的 TDD 循环、**PHPStan-level-max** 方案、安全/遥测规则以及发布纪律。 在您的 AI 编辑器中打开仓库并开始吧——规则、护栏和扩展方案都已包含在内。遵循附带的 `CLAUDE.md` 的 PR 可以一次顺利通过 CI(PHPStan max + Pest + Pint)和代码审查。 ## 测试与许可 ``` composer test # Pest (detection, idempotency, severity, sanitizer, AI explainer) composer phpstan # static analysis, level max composer pint # code style ``` **许可:** MIT — 参见 [LICENSE](LICENSE)。是 [`padosoft/laravel-rebel`](https://github.com/padosoft) 套件的一部分。
标签:ffuf