本文目录导读:

我来详细介绍PHP项目代码审计的完整流程和方法。
代码审计前的准备
环境搭建
# 搭建本地调试环境 - PHP + MySQL/MariaDB - Xdebug 调试工具 - IDE(VS Code/PHPStorm) - 代码版本管理(Git) # 安装审计工具 - Composer 依赖管理 - 安全扫描工具
审计清单准备
- 项目架构文档
- 数据库设计文档
- API接口文档
- 历史漏洞记录
自动化审计工具
静态分析工具
RIPS(商业工具)
# 安装RIPS git clone https://github.com/ripsscanner/rips # 配置Web服务器访问
PHPStan
composer require --dev phpstan/phpstan
# 配置文件 phpstan.neon
parameters:
level: 9
paths:
- src
checkMissingIterableValueType: true
Psalm
composer require --dev vimeo/psalm # 初始化配置 ./vendor/bin/psalm --init ./vendor/bin/psalm --alter --issues=UnusedUse
动态分析工具
代码覆盖率工具
# Xdebug配置 xdebug.mode=coverage # 运行测试并生成报告 phpunit --coverage-html coverage/
常见漏洞审计方法
SQL注入审计
搜索关键词:
// 危险函数搜索 $_GET, $_POST, $_REQUEST mysql_query, mysqli_query, PDO::query SELECT, INSERT, UPDATE, DELETE
示例代码审计:
// 危险代码
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];
$result = mysql_query($sql);
// 安全代码
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
XSS审计
搜索关键词:
echo, print, print_r $_SERVER['PHP_SELF'] $_COOKIE htmlspecialchars, strip_tags
检查案例:
// 危险代码 echo "欢迎:" . $_GET['username']; // 安全代码 echo "欢迎:" . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8');
文件包含审计
搜索关键词:
include, include_once require, require_once file_get_contents, file_put_contents unlink, rename, copy
命令执行审计
搜索关键词:
exec, system, shell_exec passthru, popen, proc_open eval, assert, preg_replace /e
手动审计流程
入口文件审计
// 检查 index.php, app.php, bootstrap.php - 错误报告设置 - 安全配置 - 自动加载机制 - session配置
配置文件审计
// 检查 config/*.php - 数据库密码强度 - 密钥key复杂度 - 调试模式关闭 - 上传配置限制
核心功能审计
自定义函数审计:
// 检查函数文件中的自定义函数
function clean_input($data) {
// 是否真的安全?
return $data;
}
// 检查全局变量使用
global $db, $config;
第三方组件审计
// 检查 composer.json - Laravel/Symfony框架版本 - 第三方包版本 - 已知漏洞CVE
审计检查清单
输入验证审计
- [ ] 所有用户输入是否过滤?
- [ ] 白名单验证是否实现?
- [ ] 长度限制是否设置?
- [ ] 类型检查是否严格?
输出转义审计
- [ ] HTML输出是否转义?
- [ ] JSON输出是否安全?
- [ ] SQL语句参数化?
- [ ] 模板引擎自动转义?
身份认证审计
- [ ] 密码存储加密?
- [ ] Session管理安全?
- [ ] Token生成随机?
- [ ] CSRF防护?
敏感操作审计
- [ ] 文件上传限制?
- [ ] 数据库操作权限?
- [ ] 文件权限设置?
- [ ] 日志记录完整?
审计报告模板
漏洞报告示例
# 漏洞报告:SQL注入漏洞
## 漏洞编号
VULN-2024-001
## 严重程度
高危
## 漏洞描述
user.php文件的login()函数存在SQL注入漏洞
## 影响范围
- 文件:app/controllers/UserController.php
- 行号:第45-60行
- 影响版本:v2.0.0 - v2.3.0
## 复现步骤
1. 发送POST请求:/user/login
2. 参数:username=' OR 1=1 --
3. 可绕过登录验证
## 修复建议
```php
// 使用参数化查询替代字符串拼接
$stmt = $db->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_POST['username']]);
参考链接
- OWASP SQL Injection Prevention
- CWE-89
审计人员
张三 日期:2024-01-15
## 七、持续审计策略
### 1. CI/CD集成
```yaml
# .github/workflows/security.yml
name: Security Audit
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run PHPStan
run: vendor/bin/phpstan analyse src
- name: Run Psalm
run: vendor/bin/psalm
定期审计计划
- 每周:自动化扫描
- 每月:手动代码审查
- 每季度:渗透测试
- 每年:第三方审计
最佳实践建议
-
分层审查
- 业务逻辑层
- 数据访问层
- 展示层
- 接口层
-
重点区域
- 用户输入处理
- 数据库操作
- 文件操作
- API接口
- 第三方集成
-
工具组合
- 静态分析 + 动态分析
- 自动扫描 + 手动审查
- 代码审查 + 渗透测试
PHP代码审计需要:
- 结合自动化工具和手动审查
- 关注常见漏洞模式
- 建立完整的审计流程
- 持续改进安全措施
审计不是一次性的工作,而是需要持续集成到开发流程中的环节。