professor-13/php-security-scanner
GitHub: professor-13/php-security-scanner
一款零依赖的本地PHP静态代码安全扫描工具,内置污点追踪和百余条OWASP检测规则。
Stars: 0 | Forks: 0
# PHP 安全扫描器
一款使用 Go 构建的本地 PHP 安全代码审查工具 (SAST)。零外部依赖。
```
╔══════════════════════════════════════════════════╗
║ PHP Security Scanner v2.0.0 ║
║ OWASP Top 10 + Taint Analysis SAST Tool ║
║ 109+ Detection Rules | 25+ Categories ║
╚══════════════════════════════════════════════════╝
```
## 功能特性
- **109+ 条检测规则**,涵盖 25+ 个漏洞类别
- **过程内污点追踪** — 追踪用户输入从源点到汇点的过程
- **4 种输出格式** — 终端(彩色)、HTML、JSON、SARIF
- **感知净化器** — 识别 `htmlspecialchars()`、`prepared statements`、WordPress 转义函数等
- **置信度评分** — 为每个发现提供高 / 中 / 低置信度
- **规则去重** — 整合重叠的正则和污点追踪发现
- **流可视化** — 在所有报告中显示完整的污点路径(源 → 赋值 → 汇)
- **Semgrep 规则导入** — 将 Semgrep YAML 规则转换为扫描器格式
- **基线比较** — 仅追踪扫描之间新增的发现
- **框架检测** — Laravel, WordPress, Symfony, CodeIgniter, CakePHP
- **并发扫描** — 使用可配置的 worker 进行并行文件处理
- **项目配置文件** — `.php-scanner.json` 用于存储项目级设置
- **内联抑制** — `// nosec` 注释用于标记有意保留的模式
- **CI/CD 就绪** — SARIF 输出用于 GitHub Code Scanning,退出代码用于构建关卡
- **零依赖** — 纯 Go 标准库,单一二进制文件
## 环境要求
| 要求 | 版本 |
|-------------|---------|
| **Go** | 1.21 或更高版本 |
| **Git** | 任意版本 (用于克隆) |
仅此而已。不需要 pip, npm, composer 或任何包管理器。
## 快速开始
```
# 克隆仓库
git clone https://github.com/professor-13/php-security-scanner.git
cd php-security-scanner
# 构建
go build -o php-security-scanner . # Linux/macOS
go build -o php-security-scanner.exe . # Windows
# 扫描
./php-security-scanner /path/to/php/project
```
## 安装说明
请参阅 **[INSTALLATION.txt](INSTALLATION.txt)** 获取详细的分步说明,包括:
- Windows, macOS 和 Linux 的 Go 安装
- 从源代码构建
- 全局安装
- CI/CD 集成设置
### 安装 Go
**Windows:** `winget install GoLang.Go`
**macOS:** `brew install go`
**Linux:** `sudo apt install golang-go` 或从 [go.dev/dl](https://go.dev/dl/) 下载
## 使用方法
```
# 基础扫描
./php-security-scanner ./src
# 仅显示高/严重级别发现
./php-security-scanner -s high ./src
# 排除 vendor 目录
./php-security-scanner -e "vendor/*,node_modules/*,test/*" ./src
# 生成所有报告格式
./php-security-scanner --json --sarif -o ./results ./src
# 扫描单个文件
./php-security-scanner ./path/to/file.php
```
### 所有 CLI 参数
```
Output Flags:
-o, --output string Output directory for reports (default "./report")
--no-html Skip HTML report generation
--json Also output JSON report
--sarif Also output SARIF report (GitHub/CI/CD integration)
Analysis Flags:
-s, --severity string Minimum severity: critical, high, medium, low, info
-e, --exclude string Comma-separated glob patterns to exclude
--rules-dir string Directory containing custom JSON rule files
--disable-rule string Comma-separated rule IDs to disable
--context-lines int Lines of context before/after findings (default 3)
--concurrency int Number of parallel workers, 0=auto (default 0)
--show-suppressed Include // nosec suppressed findings in output
Baseline Flags:
--baseline string Compare against baseline file (show only new findings)
--save-baseline string Save current scan as baseline to this path
Utility Flags:
--init-config Create a default .php-scanner.json config
--init-rules Create an example custom-rules.json file
--version Show version and exit
```
### 退出代码
| 代码 | 含义 |
|------|---------|
| `0` | 未发现严重或高危级别的发现 |
| `1` | 检测到严重或高危级别的发现 |
| `2` | 扫描器错误 |
## 漏洞类别
| 类别 | CWE | 规则 |
|----------|-----|-------|
| SQL 注入 | CWE-89 | SQL-001 to SQL-008 |
| 跨站脚本攻击 (XSS) | CWE-79 | XSS-001 to XSS-007 |
| 命令注入 | CWE-78/94 | CMD-001 to CMD-009 |
| 文件包含 (LFI/RFI) | CWE-98 | FI-001 to FI-003 |
| 路径遍历 | CWE-22 | PT-001 to PT-007 |
| 不安全的反序列化 | CWE-502 | DESER-001 to DESER-003 |
| SSRF | CWE-918 | SSRF-001 to SSRF-004 |
| 弱加密 | CWE-327/328/330 | CRYPTO-001 to CRYPTO-008 |
| 硬编码凭证 | CWE-798 | AUTH-001 to AUTH-015 |
| 信息泄露 | CWE-200/209 | INFO-001 to INFO-007 |
| 文件上传 | CWE-434 | UPLOAD-001 to UPLOAD-004 |
| CSRF | CWE-352 | CSRF-001 to CSRF-002 |
| 开放重定向 | CWE-601 | REDIR-001 to REDIR-002 |
| XXE | CWE-611 | XXE-001 to XXE-005 |
| 不安全配置 | CWE-16/384 | CONFIG-001 to CONFIG-007 |
| 类型戏法 | CWE-1025 | TYPE-001 to TYPE-003 |
| Header 注入 | CWE-113 | HEADER-001 to HEADER-002 |
| 日志注入 | CWE-117 | LOG-001 to LOG-002 |
| LDAP 注入 | CWE-90 | LDAP-001 to LDAP-002 |
| XPath 注入 | CWE-643 | XPATH-001 |
| 竞态条件 (TOCTOU) | CWE-367 | RACE-001 |
| 不安全传输 | CWE-319/295 | HTTP-001 to HTTP-003 |
| 正则 DoS (ReDoS) | CWE-1333 | REDOS-001 |
| 邮件注入 | CWE-93 | EMAIL-001 |
| 会话固定 | CWE-384 | SESSION-001 |
| 不安全的对象创建 | CWE-470 | OBJ-001 to OBJ-002 |
## 污点追踪
扫描器执行过程内污点分析,以追踪用户输入(`$_GET`, `$_POST`, `$_REQUEST`, `$_COOKIE`)通过变量赋值流向危险汇点(`mysqli_query()`, `echo`, `exec()` 等)的过程。
污点发现包含完整的流轨迹:
```
[SOURCE] L83 $cid = $_POST["cid"]; ($cid)
-> [ASSIGN] L84 $sql = "SELECT * FROM ... WHERE id='$cid'"; ($sql)
-> [ SINK ] L85 $result = mysqli_query($con, $sql); ($sql)
```
## 配置
创建一个项目配置文件:
```
./php-security-scanner --init-config
```
这将创建 `.php-scanner.json`:
```
{
"min_severity": "low",
"exclude_patterns": ["vendor/*", "node_modules/*"],
"output_dir": "./report",
"disabled_rules": [],
"concurrency": 0,
"context_lines": 3
}
```
CLI 参数的优先级始终高于配置文件中的值。
## Semgrep 规则导入
将现有的 Semgrep YAML 规则转换为扫描器的 JSON 格式:
```
# 从单个文件导入
./php-security-scanner import-semgrep ./rules/php-sqli.yaml
# 从目录导入
./php-security-scanner import-semgrep ./semgrep-rules/php/
# 使用导入的规则
./php-security-scanner --rules-dir . ./src
```
仅导入 PHP 规则;其他语言会自动跳过。
## CI/CD 集成
### GitHub Actions
```
name: PHP Security Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.21'
- name: Build scanner
run: |
git clone https://github.com/professor-13/php-security-scanner.git /tmp/scanner
cd /tmp/scanner && go build -o /usr/local/bin/php-security-scanner .
- name: Run scan
run: php-security-scanner --sarif -s high -e "vendor/*" .
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: report/php-security-report.sarif
```
### PR 基线
```
# 在主分支上:保存基线
./php-security-scanner --save-baseline baseline.json ./src
# 在 PR 上:仅显示新发现
./php-security-scanner --baseline baseline.json ./src
```
## 项目结构
```
php-security-scanner/
main.go # CLI entry point, flag parsing, subcommands
go.mod # Go module (zero external dependencies)
scanner/
models.go # Data types (Finding, Rule, ScanConfig, FlowStep)
scanner.go # Core scanning engine, taint integration, dedup
rules.go # 86 built-in OWASP detection rules
rules_extra.go # 23 additional rules (type juggling, LDAP, etc.)
taint.go # Intraprocedural taint tracking engine
sanitizers.go # Sanitizer detection (50+ PHP functions)
framework.go # Framework detection (Laravel, WordPress, etc.)
config.go # Project config file (.php-scanner.json)
cache.go # File content caching
yaml_loader.go # Custom YAML rule loader
semgrep_importer.go # Semgrep YAML rule importer & converter
reporter/
terminal.go # Color-coded terminal output with flow traces
html.go # Interactive HTML report + JSON export
sarif.go # SARIF v2.1.0 output with CodeFlows
testdata/ # Sample vulnerable PHP projects for testing
```
## 许可证
本项目是开源的。有关许可证详细信息,请参阅仓库。
标签:CI/CD安全, CISA项目, ffuf, Go语言开发, GraphQL安全矩阵, Homebrew安装, Laravel安全, Llama, OWASP Top 10, PHP代码审计, SARIF输出, SAST, Semgrep集成, SQL注入检测, Symfony安全, WordPress安全, XSS注入, 云安全监控, 代码安全, 安全专业人员, 安全扫描器, 开源安全工具, 操作系统监控, 敏感数据流追踪, 日志审计, 漏洞枚举, 盲注攻击, 跨站脚本攻击检测, 逆向工程平台, 零依赖, 静态分析