29 安全加固与部署检查
可得财务 1.0.3 对认证、支付、授权和数据库输入进行了系统加固。本页只公开部署侧要求,不公开授权通信协议、内部密钥或可用于绕过验证的实现细节。
升级后必须检查
- 生产环境使用 PHP 8.1–8.4,并启用
openssl、curl、mbstring、gd、pdo_mysql - 全站启用 HTTPS,HTTP 仅用于跳转 HTTPS
.env中APP_DEBUG=falseJWT_SECRET由安装器随机生成,长度不少于 32 字节;禁止使用示例值runtime/、.env、.installed不允许通过 Web 访问- 更新包必须通过 SHA-256 校验;配置发布公钥后还必须通过数字签名
登录与注册保护
- 管理后台、会员登录和会员注册均强制人机验证码
- 验证码一次性使用,错误次数达到上限后立即失效
- 多次密码错误会触发临时封禁;不存在的账号与停用账号使用统一错误提示
- 演示模式不再提供固定口令账号,也不能免密进入后台
- 密码至少 10 位,并同时包含字母和数字
支付安全
- 支付入账只接受服务器到服务器的
POST异步通知 - 浏览器同步跳回只负责展示结果,不能修改账单状态
- 回调签名、交易状态、订单号、交易号和金额必须全部校验通过
- 查询字符串不能覆盖签名正文中的字段
- 零元单防伪造(Build 191+):零元单回调金额必须 ≥ 0、交易号不能为空;若账单总额不为 0 却收到零元通知,直接拒绝并记录
- EpayGateway 签名可配(Build 191+):支持 SHA256 / MD5 两种签名算法,后台可切换;推荐生产环境使用 SHA256
授权安全
- 激活与心跳均使用加密认证通道
- 授权码不会以明文写入客户端磁盘
- 客户端与授权站同时限制激活尝试频率
- 公开授权状态只返回最小状态,不返回安装标识、授权 ID 等内部信息
- 授权状态文件使用原子写入、文件锁和可验证备份
数据库与输入
- 业务查询使用 ORM 或预编译参数
- 安装器严格限制数据库名、表前缀、主机和端口格式
- 后台模糊搜索会限制长度并转义
%、_等通配符 - 商品富文本使用标签、属性和 URL 协议白名单净化
- 文件上传类型校验(Build 191+):Logo 等上传不仅检查扩展名,还通过
finfo读取真实 MIME 类型进行二次校验,拒绝扩展名与 MIME 不匹配的文件
发现问题
请不要在公开群发送数据库、授权码、密钥或完整错误日志。提交问题时仅提供:
- 系统版本与 build
- PHP / MySQL 版本
- 已脱敏的错误时间和错误类型
- 可复现步骤(不要包含密钥)
上一篇:28 授权与安装接入
Build 191 安全更新摘要
| 漏洞等级 | 修复项 | 涉及文件 |
|---|---|---|
| HIGH | EpayGateway 支持 SHA256 签名(可配置 sign_type) | app/common/gateway/driver/EpayGateway.php |
| HIGH | 零元单防伪造:金额 ≥ 0、交易号非空、账单总额校验、float round 保护 | app/common/service/PaymentService.php |
| HIGH | 命令注入防护:Composer 路径白名单校验 | app/common/service/InstallService.php |
| HIGH | 文件上传绕过防护:finfo MIME 二次校验 | app/admin/controller/Setting.php |
| MEDIUM | 自定义后台路径 nginx 自动插入:切换路径后自动同步 vhost 配置 | app/common/service/InstallService.php |
| MEDIUM | 环境检测全部 14 项正常返回(pre-router bypass 修复) | public/index.php |