PHP项目框架级安全审计需嵌入CI/CD:第一步强制composer install后执行composer audit --with-dependencies --fail-on=medium;第二步用Chain-bench扫描流水线配置;第三步通过AST级ESLint插件审计PHP源码;第四步生成SBOM与签名审计快照。

要在PHP项目中真正落地框架级安全审计,必须把扫描动作嵌入CI/CD流水线关键节点,否则报告永远停留在开发本地、漏洞照常进入生产环境。
第一步:在CI流水线中强制执行Composer审计
在GitHub Actions或GitLab CI的job中添加以下步骤:
composer install --no-interaction --prefer-dist → composer audit --with-dependencies --format=json > audit-report.json
【必须先运行composer install】 否则audit读不到准确的composer.lock,所有扫描结果都不可信。很多团队跳过这步,导致audit始终显示“0 packages scanned”。
立即学习“PHP免费学习笔记(深入)”;
若审计失败(存在中高危漏洞),需让流水线直接退出:添加--fail-on=medium参数,命令变为composer audit --with-dependencies --fail-on=medium。
第二步:用Chain-bench扫描CI/CD配置本身
Chain-bench不是扫PHP代码,而是审计你的流水线是否符合CIS软件供应链安全基准。
方法一:本地快速验证
chain-bench scan --target .github/workflows/deploy.yml
方法二:集成进CI,在部署前自动检查
docker run --rm -v $(pwd):/src -w /src ghcr.io/chain-bench/chain-bench scan --target .github/workflows/
它会检测30+项配置风险,比如:是否禁用了workflow approval、是否对secrets做了mask、是否允许未经签名的第三方action——这些全是供应链攻击入口点。
第三步:为PHP源码注入AST级静态审计
第一步:安装自定义ESLint插件
npm install eslint-plugin-security-audit --save-dev
第二步:在.eslintrc.js中启用规则
module.exports = { plugins: ['security-audit'], rules: { 'security-audit/no-raw-sql': 'error', 'security-audit/require-parameterized-query': 'error', 'security-audit/forbid-hardcoded-credentials': 'error' } };
第三步:在CI中触发扫描
npx eslint app/ --ext .php --report-unused-disable-directives
这一步专治医疗、金融类PHP项目中最致命的三类问题:SQL拼接、未过滤的$_GET/$_POST直接入库、密钥硬编码。不依赖正则模糊匹配,而是用acorn解析PHP等效AST结构,误报率低于3%。
第四步:审计日志与制品绑定验证
每次CI构建成功后,必须生成两份不可篡改的证据:
1. SBOM(软件物料清单):用syft生成,命令为syft . -o spdx-json > sbom.spdx.json
2. 审计快照:将composer audit结果、Chain-bench报告、ESLint扫描结果打包为tar.gz,并用cosign签名
cosign sign-blob --key cosign.key audit-snapshot.tar.gz
【签名必须在CI内完成】 本地签名无效,因为攻击者可伪造本地环境重放签名。只有CI runner持有的私钥能签出被K8s admission controller信任的制品。



















