使用文档

时光授权系统文档

从快速开始到 API 对接,全面了解授权系统的使用与集成

安全建议

授权系统涉及金钱交易和用户数据,安全是首要任务。本章列出常见攻击方式和防护措施。

威胁模型

主要风险:

  • 管理员账号被爆破:撞库、暴力破解
  • 授权码伪造:跳过付费直接获取有效授权
  • 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 等扫描工具检测漏洞

应急响应

如果发现被入侵,立即:

  1. 冻结账户:禁用所有管理员账号
  2. 轮换密钥:改 API_SECRET、数据库密码
  3. 撤销授权:把所有 active 授权改成 suspended
  4. 查日志:找入侵路径
  5. 通知用户:如果数据泄露,立即告知并建议改密码
最重要的一条:永远不要在公开仓库提交 inc/db.php!