igor-php/igor-php
GitHub: igor-php/igor-php
专为 FrankenPHP Worker 模式设计的静态分析工具,检测 Symfony 共享服务中的状态突变、内存泄漏和全局污染风险。
Stars: 65 | Forks: 0
# 🧟♂️⚡ Igor-Php
/igor_service_map.json`。
- **优势**:Go 二进制文件读取此文件,而不是执行繁重的 `debug:container` 命令。这使得审计启动几乎瞬间完成,并确保 100% 的准确性,即使是复杂编译器通道或装饰器添加的服务也不例外。
#### `igor_service_map.json` 示例:
```
{
"definitions": {
"app.mail_service": {
"class": "App\\Service\\MailService",
"public": true,
"shared": true
},
"logger": {
"class": "Monolog\\Logger",
"public": true,
"shared": true
}
},
"aliases": {
"Psr\\Log\\LoggerInterface": "logger"
}
}
```
## ⚙️ 配置说明
您可以通过在项目根目录创建 `igor.json` 文件来自定义 Igor 的行为:
```
{
"exclude": ["vendor", "var", "src/Entity"],
"safe_namespaces": ["Symfony\\", "Doctrine\\", "Twig\\", "IgorPhp\\IgorBundle\\"],
"console_path": "bin/console",
"env": "dev",
"verbose": false
}
```
耗时:1.2s
💡 建议:
[PROJECT] 由于这是您自己的代码,您应该将这些服务重构为无状态的,
或者实现 ResetInterface 以在请求之间清除状态。
[VENDOR] 这是第三方代码。如果您无法修复它,请考虑在您的 Worker 配置中设置一个 'max_requests' 限制,以缓解内存泄漏。
```
---
## ⚙️ 配置
You can customize Igor's behavior by creating an `igor.json` file at the root of your project:
```json
{
"exclude": ["vendor", "tests", "Entity"],
"safe_namespaces": ["Symfony\\", "Doctrine\\", "IgorPhp\\IgorBundle\\"],
"scan_vendors": ["my-company/internal-bundle"],
"baseline": "igor-baseline.json",
"console_path": "bin/console",
"env": "dev",
"verbose": false
}
```
- **exclude**:索引期间要跳过的目录列表。
- **safe_namespaces**:Igor 将忽略以这些前缀开头的类中的状态修改。
- **scan_vendors**:`vendor/` 中要递归扫描的子目录列表。
- **baseline**:包含要忽略的发现结果的基线文件路径。
- **console_path**:Symfony 控制台二进制文件的自定义路径。默认为 `bin/console`。
- **env**:用于容器分析的 Symfony 环境。默认为 `dev`。
- **verbose**:启用详细输出以查看跳过的服务及其原因。默认为 `false`。
### 选择性忽略
如果您有一行特定的代码确认是安全的,您可以使用 `// @igor-ignore` 注解:
```
// @igor-ignore
$this->cache = $data; // This line will be ignored
$this->counter++; // @igor-ignore - This line too
```
## 🔍 了解深度审计过滤机制
使用**深度审计**模式 时,Igor 分析的服务数量可能会少于您容器的总服务数。使用 `--verbose` 标志可以确切了解服务被跳过的原因。常见原因包括:
- **🔄 重复文件**:多个服务 ID(别名、定位器等)指向同一个 PHP 文件。Igor 仅对每个唯一文件审计一次。
- **♻️ 非共享**:标记为 `shared: false` 的服务会在每次请求时重新创建,并且不会在 Worker 之间保持状态。它们在设计上是安全的。
- **λ 闭包 / 合成**:未映射到物理 PHP 类的服务(例如 Closures 或合成服务)无法进行静态分析。
- **🛡️ 安全命名空间**:该类属于 `safe_namespaces` 中定义的命名空间(例如 `Symfony\` 或 `Doctrine\`)。
## 🤖 CI/CD 集成
Igor 旨在在您的 CI 流水线中开箱即用。如果发现任何错误,它将以 **代码 1** 退出,从而有效中止您的构建。
### GitHub Actions 支持
在 GitHub Actions 内运行时,Igor 会自动生成**行内注解**。这意味着错误将直接显示在您的 Pull Request 审查中,紧挨着导致问题的代码旁。
标签:EVTX分析, FrankenPHP, Go语言开发, Linter, PHP Superglobals, PHP代码质量, PHP反射, PHP静态分析, pptx, ResetInterface, Symfony框架, Worker Mode, 不可变对象, 代码审计工具, 内存泄漏检测, 只读属性, 多线程扫描, 开源安全工具, 持久化内存, 日志审计, 本地静态变量, 源码安全审计, 状态变异检测, 逆向工程平台, 静态代码扫描