安全建议
授权系统涉及金钱交易和用户数据,安全是首要任务。本章列出常见攻击方式和防护措施。
威胁模型
主要风险:
- 管理员账号被爆破:撞库、暴力破解
- 授权码伪造:跳过付费直接获取有效授权
- SQL 注入:通过参数注入恶意 SQL
- XSS 攻击:在公告、用户名等字段注入 JS
- CSRF:诱导管理员执行非预期操作
- 支付回调伪造:模拟易支付回调骗取授权
已实现的安全机制
| 威胁 | 防护 | 实现位置 |
|---|---|---|
| 暴力破解 | 登录失败 5 次锁定 15 分钟 | lic_login_attempts 表 |
| 签名伪造 | HMAC-SHA256 + hash_equals 防时序攻击 |
api/verify.php |
| SQL 注入 | 全部使用 PDO 预处理语句 | 所有数据库操作 |
| XSS | 所有输出用 htmlspecialchars() / e() |
所有视图文件 |
| CSRF | 所有表单提交验证 csrf_token |
shiguang_csrf_token() |
| 支付回调伪造 | 验证易支付 MD5 签名 + 金额校验 | api/epay_notify.php |
| 密码泄露 | password_hash bcrypt 存储,不存明文 |
lic_users、lic_admins |
| Session 劫持 | session_regenerate_id() 登录后刷新 |
所有登录入口 |
| Remember Token 盗用 | 存 SHA256(token),不存明文 | lic_remember_tokens 表 |
额外的安全加固建议
1. 启用 HTTPS(强制)
所有流量必须 HTTPS,否则:
- 授权码在网络传输中可被窃取
- API 签名可被重放
- 管理员 Cookie 可被窃取
配置方法:
# Nginx 强制 HTTPS
server {
listen 80;
server_name license.example.com;
return 301 https://$server_name$request_uri;
}
2. 设置安全的 HTTP 头
已经在 Nginx 配置示例中包含(见 部署上线)。
3. 限制管理后台访问
通过 IP 白名单限制后台访问:
location /admin/ {
allow 192.168.1.0/24; # 你的办公室 IP 段
allow 1.2.3.4; # 你家的 IP
deny all;
}
4. 数据库最小权限原则
不要给授权服务器 root 权限!创建专用账号:
-- 只授权必要的库
CREATE USER 'license_app'@'localhost' IDENTIFIED BY 'strong-pass';
GRANT SELECT, INSERT, UPDATE, DELETE ON license_server.* TO 'license_app'@'localhost';
FLUSH PRIVILEGES;
5. 定期轮换密钥
- API_SECRET:每年轮换一次(修改后所有客户端需同步更新)
- HMAC_SALT:仅数据库内使用,相对稳定
- 数据库密码:每季度轮换
- 管理员密码:强制每 90 天更换(通过管理员设置实现)
6. 启用审计日志告警
监控异常操作:
<?php
// 检测异常:短时间内大量失败登录
function check_suspicious_activity() {
$db = get_db();
$stmt = $db->prepare("SELECT COUNT(*) FROM " . table('login_attempts') . "
WHERE success = 0 AND attempted_at > DATE_SUB(NOW(), INTERVAL 10 MINUTE)");
$stmt->execute();
$count = $stmt->fetchColumn();
if ($count > 50) {
// 发送告警邮件给管理员
mail(get_setting('admin_email'), '[告警] 异常登录尝试',
"过去 10 分钟有 {$count} 次登录失败,请检查。");
}
}
加入 cron:
*/10 * * * * php /www/wwwroot/license.example.com/cron/check_security.php
7. 数据脱敏(备份文件)
备份文件里包含用户邮箱、密码哈希等敏感数据,备份文件应该:
- 加密存储(GPG)
- 只允许特定 IP 下载
- 定期删除老备份
8. 严格的 CSP(Content Security Policy)
防止 XSS 加载外部脚本:
<?php
// 在所有页面顶部
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; img-src 'self' data: https:; font-src 'self' https://cdn.jsdelivr.net;");
9. 关闭目录浏览
autoindex off;
10. 定期安全审计
每月执行:
- 检查
lic_admin_audit_logs异常操作 - 检查
lic_login_attempts可疑 IP - 检查数据库备份完整性
- 更新 PHP / MySQL 到最新稳定版
- 用 Acunetix 等扫描工具检测漏洞
应急响应
如果发现被入侵,立即:
- 冻结账户:禁用所有管理员账号
- 轮换密钥:改
API_SECRET、数据库密码 - 撤销授权:把所有
active授权改成suspended - 查日志:找入侵路径
- 通知用户:如果数据泄露,立即告知并建议改密码
最重要的一条:永远不要在公开仓库提交
inc/db.php!