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注入, 云安全监控, 代码安全, 安全专业人员, 安全扫描器, 开源安全工具, 操作系统监控, 敏感数据流追踪, 日志审计, 漏洞枚举, 盲注攻击, 跨站脚本攻击检测, 逆向工程平台, 零依赖, 静态分析