# 第一阶段:基础设施审查报告 ## 审查概述 | 项目 | 详情 | |------|------| | 审查日期 | 2026年5月19日 | | 审查范围 | Dockerfile、docker-compose、Nginx、PHP配置、定时任务、启动脚本 | | 发现问题数 | **23个** | | 高风险问题 | 6个 | | 中风险问题 | 10个 | | 低风险问题 | 7个 | --- ## 1. Dockerfile 审查 **文件位置**:`Dockerfile` ### 🔴 高风险问题 #### 1.1 PHP 版本已终止支持 ```dockerfile FROM php:7.3-fpm-alpine ``` - **问题**:PHP 7.3 已于 2021年12月6日 EOL,不再接收安全更新 - **风险**:已知漏洞无法修复,存在被攻击风险 - **建议**:升级到 PHP 8.1 或 8.2 #### 1.2 使用 root 用户运行服务 ```dockerfile CMD ["/bin/sh", "/usr/local/bin/up.sh", "/app/www/new_sdk/crontab.sh"] ``` - **问题**:容器内所有服务以 root 身份运行 - **风险**:容器逃逸后直接获得 root 权限 - **建议**:创建专用用户运行应用 #### 1.3 敏感文件可能被 COPY 到镜像 ```dockerfile COPY . /app ``` - **问题**:会复制所有文件,包括 `.env`、密钥文件等 - **风险**:敏感信息泄露到镜像层 - **建议**:使用 `.dockerignore` 排除敏感文件 ### 🟡 中风险问题 #### 1.4 Composer 使用 snapshot 版本 ```dockerfile && php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot ``` - **问题**:使用 `--snapshot` 安装非稳定版本 - **风险**:可能引入未测试的代码 - **建议**:移除 `--snapshot` 参数 #### 1.5 缺少多阶段构建 - **问题**:构建依赖和运行时依赖混在一起 - **风险**:镜像体积过大,攻击面大 - **建议**:使用多阶段构建分离构建和运行环境 --- ## 2. docker-compose.yml 审查 **文件位置**:`docker-compose.yml` ### 🔴 高风险问题 #### 2.1 缺少资源限制 ```yaml services: new_sdk: build: . ``` - **问题**:没有设置 CPU/内存限制 - **风险**:单个容器可能耗尽宿主机资源 - **建议**:添加 `deploy.resources.limits` ### 🟡 中风险问题 #### 2.2 缺少健康检查 - **问题**:没有 healthcheck 配置 - **风险**:无法自动检测服务故障 - **建议**:添加健康检查配置 #### 2.3 缺少重启策略 - **问题**:没有 restart 策略 - **风险**:服务崩溃后不会自动恢复 - **建议**:添加 `restart: unless-stopped` #### 2.4 非标准端口映射 ```yaml ports: - "66:80" - "67:443" ``` - **问题**:使用非标准端口 - **风险**:可能被防火墙阻止,混淆攻击者(优点) - **建议**:根据实际部署环境调整 --- ## 3. Nginx 配置审查 **文件位置**:`nginx/nginx.conf`, `nginx/default.conf`, `nginx/https.conf`, `nginx/sdkapi.qmgames.cn.conf` ### 🔴 高风险问题 #### 3.1 client_max_body_size 过大 ```nginx client_max_body_size 2048M; # default.conf client_max_body_size 2048M; # sdkapi.qmgames.cn.conf ``` - **问题**:允许上传 2GB 文件 - **风险**:DoS 攻击、磁盘空间耗尽 - **建议**:根据业务需求设置合理值(如 50M) #### 3.2 缺少安全响应头 - **问题**:未配置以下安全头 - `X-Frame-Options` - 防止点击劫持 - `X-Content-Type-Options` - 防止 MIME 类型嗅探 - `X-XSS-Protection` - XSS 过滤 - `Content-Security-Policy` - 内容安全策略 - `Strict-Transport-Security` - HSTS - **建议**:添加所有安全响应头 #### 3.3 SSL 配置不完整 ```nginx ssl_certificate /app/key/sdkapi.qmgames.cn.pem; ssl_certificate_key /app/key/sdkapi.qmgames.cn.key; ``` - **问题**:缺少以下配置: - `ssl_protocols` - 应只允许 TLSv1.2+ - `ssl_ciphers` - 应使用强密码套件 - `ssl_session_timeout` - `ssl_stapling` - OCSP 装订 - **建议**:完善 SSL 安全配置 ### 🟡 中风险问题 #### 3.4 缺少 Rate Limiting - **问题**:没有配置请求频率限制 - **风险**:API 被暴力破解、DDoS - **建议**:添加 `limit_req_zone` 和 `limit_conn_zone` #### 3.5 default.conf 暴露多个域名 ```nginx server_name devsdkapi.7dgame.cn devsdkadmin.7dgame.cn ...; ``` - **问题**:开发域名暴露在生产配置中 - **建议**:分离开发和生产配置 --- ## 4. PHP 配置审查 **文件位置**:`php-fpm/php-ini-overrides.ini` ### 🟡 中风险问题 #### 4.1 upload_max_filesize 过大 ```ini upload_max_filesize = 1024M ``` - **问题**:允许上传 1GB 文件 - **风险**:配合 Nginx 配置,可能导致资源耗尽 - **建议**:根据业务需求设置合理值 #### 4.2 OPcache 被禁用 ```ini opcache.enable= 0 ``` - **问题**:PHP OPcache 未启用 - **风险**:性能损失约 50-70% - **建议**:生产环境应启用 OPcache ### ✅ 良好实践 ```ini expose_php = Off # 不暴露 PHP 版本信息 ``` --- ## 5. 定时任务审查 **文件位置**:`crontabs/crontabfile.txt` ### 🟡 中风险问题 #### 5.1 pay_timeout 任务可能并发冲突 ```cron * * * * * bash /app/script/pay_timeout.sh * * * * * sleep 30; bash /app/script/pay_timeout.sh ``` - **问题**:每分钟执行两次,如果任务执行超过30秒可能并发 - **风险**:重复处理订单 - **现状**:脚本中使用了 flock 锁,部分缓解了问题 - **建议**:确保所有脚本都有锁机制 #### 5.2 daily.sh 是空脚本 ```bash #!/bin/sh # cd /app/www/new_sdk/ # su www-data -s /usr/local/bin/php artisan command:jiubidetail >> /app/script/jiubidetail.log # sh /app/www/push_websocketstart.sh >> ``` - **问题**:脚本内容被注释掉,没有实际功能 - **建议**:清理无用脚本或恢复功能 --- ## 6. 启动脚本审查 **文件位置**:`php-fpm/up.sh` ### 🟡 中风险问题 #### 6.1 PHP-FPM 后台运行 ```bash nohup php-fpm > /var/log/php-fpm.log 2>&1 & ``` - **问题**:PHP-FPM 以后台进程运行 - **风险**:进程崩溃无法自动重启 - **建议**:使用 supervisord 管理进程 #### 6.2 文件权限设置 ```bash chown www-data -R /app/www/new_sdk & ``` - **问题**:使用 `&` 后台执行 chown - **风险**:可能在文件未完全设置好权限时就开始处理请求 - **建议**:移除 `&`,确保权限设置完成后再启动服务 --- ## 7. 入口文件审查 **文件位置**:`www/new_sdk/public/index.php` ### 🔴 高风险问题 #### 7.1 CORS 配置过于宽松 ```php header('Access-Control-Allow-Origin: *'); header("Access-Control-Allow-Methods: *"); ``` - **问题**:允许任意来源和任意方法访问 - **风险**:CSRF 攻击、数据泄露 - **建议**:限制为特定域名 #### 7.2 Socket 超时禁用 ```php ini_set('default_socket_timeout', -1); ``` - **问题**:禁用了 socket 超时 - **风险**:可能导致请求永久阻塞 - **建议**:设置合理的超时时间 --- ## 8. 问题汇总 ### 按风险等级分类 #### 🔴 高风险(需立即修复) | 序号 | 问题 | 位置 | |------|------|------| | 1 | PHP 7.3 EOL | Dockerfile:1 | | 2 | root 用户运行 | Dockerfile:78 | | 3 | 敏感文件 COPY | Dockerfile:66 | | 4 | 资源限制缺失 | docker-compose.yml | | 5 | 安全响应头缺失 | nginx/*.conf | | 6 | CORS 过于宽松 | public/index.php:14-18 | #### 🟡 中风险(建议尽快修复) | 序号 | 问题 | 位置 | |------|------|------| | 1 | Composer snapshot | Dockerfile:55 | | 2 | client_max_body_size 过大 | nginx/default.conf:6 | | 3 | SSL 配置不完整 | nginx/https.conf | | 4 | 缺少 Rate Limiting | nginx/*.conf | | 5 | OPcache 禁用 | php-ini-overrides.ini:12 | | 6 | upload_max_filesize 过大 | php-ini-overrides.ini:1 | | 7 | PHP-FPM 后台运行 | php-fpm/up.sh:3 | | 8 | chown 后台执行 | php-fpm/up.sh:5 | | 9 | pay_timeout 并发风险 | crontabs/crontabfile.txt:6-7 | | 10 | Socket 超时禁用 | public/index.php:20 | #### 🟢 低风险(建议优化) | 序号 | 问题 | 位置 | |------|------|------| | 1 | 缺少健康检查 | docker-compose.yml | | 2 | 缺少重启策略 | docker-compose.yml | | 3 | 非标准端口 | docker-compose.yml:10-11 | | 4 | 开发域名暴露 | nginx/default.conf:4 | | 5 | daily.sh 空脚本 | script/daily.sh | | 6 | 缺少多阶段构建 | Dockerfile | | 7 | 缺少 .dockerignore | 项目根目录 | --- ## 9. 修复优先级建议 ### 第一优先级(安全相关) 1. 限制 CORS 来源域名 2. 添加 Nginx 安全响应头 3. 完善 SSL 配置 4. 创建 .dockerignore 排除敏感文件 ### 第二优先级(稳定性相关) 1. 添加 docker-compose 资源限制 2. 添加健康检查和重启策略 3. 修复 PHP-FPM 启动方式 4. 启用 OPcache ### 第三优先级(长期规划) 1. 升级 PHP 版本到 8.x 2. 升级 ThinkPHP 框架版本 3. 实施多阶段构建 4. 添加 Rate Limiting --- ## 10. 参考配置 ### Nginx 安全头配置示例 ```nginx add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" always; ``` ### SSL 安全配置示例 ```nginx ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; ``` ### .dockerignore 示例 ``` .env .env_* .git .gitignore .idea *.md key/ logs/ runtime/ vendor/ ``` --- *审查报告生成时间:2026年5月19日*