「短网址服务」安全测试清单

输入校验与防注入 * SQL 注入 * 在生成短链 API 中输入恶意 URL: * 在搜索接口传入注入语句: * 预期:系统返回参数错误(100001),无数据泄露。* HTML 注入 * 自定义短码输入 HTML 标签: * 预期:保存失败,提示「短码不合法」。

1. 输入校验与防注入

  • SQL 注入

    • 在生成短链 API 中输入恶意 URL:https://abc.com' OR '1'='1
    • 在搜索接口传入注入语句:s.io/abc123' UNION SELECT ...
    • 预期:系统返回参数错误(100001),无数据泄露。
  • XSS 攻击

    • 输入长链为:<script>alert(1)</script>
    • 前端展示时是否被执行。
    • 预期:系统对 URL 做转义,前端仅展示字符串,不执行脚本。
  • HTML 注入

    • 自定义短码输入 HTML 标签:<b>shop</b>
    • 预期:保存失败,提示「短码不合法」。

2. 恶意短链检测

  • 黑名单域名

    • 输入 URL 来自钓鱼域名 → 返回错误码 120003。
  • 恶意内容检测

    • 测试接入 Google Safe Browsing / 腾讯网址安全服务。
    • 预期:恶意 URL 阻止生成短链。

3. 认证与鉴权

  • 未登录访问

    • 尝试调用需要登录的 API(如 /api/list)。
    • 预期:返回 110004(Token 无效/过期)。
  • 权限越权

    • 用户 A 尝试删除用户 B 的短链。
    • 预期:返回 110005(权限不足)。
  • API Key 管理

    • 过期的 API Key 调用 → 返回 130001(Key 无效)。
    • 已删除的 Key 调用 → 返回 130001。
    • 短时间内高频调用 → 返回 130003(超限)。

4. 短链跳转安全

  • 开放重定向

    • 确认跳转目标为 DB 中合法 URL,禁止拼接任意参数实现跳转。
    • 预期:禁止绕过生成流程直接构造跳转 URL。
  • HTTPS 强制

    • 访问短链服务必须走 HTTPS(HSTS 生效)。
    • 预期:HTTP 请求自动跳转 HTTPS。

5. 数据安全

  • 密码存储

    • 确认密码存储使用 BCrypt/Argon2,禁止明文或弱 Hash。
  • 敏感数据泄露

    • API Key 在列表展示时应打码。
    • 返回日志中不得打印完整 Token 或密码。
  • 数据库备份

    • 确认备份文件加密存储,访问控制严格。

6. 限流与防刷

  • 接口限流

    • 短时间内高频调用 /api/shorten。
    • 预期:超过阈值返回 100002 / 130003,系统稳定。
  • 验证码防护(可选)

    • 游客频繁生成短链时触发验证码机制。

7. CSRF 与跨域

  • CSRF 测试

    • 模拟第三方网站发起 POST 请求到短链 API。
    • 预期:请求被拦截(Token 校验或 SameSite Cookie)。
  • CORS 配置

    • 测试跨域访问接口。
    • 预期:仅允许白名单域名调用 API。

8. 文件与二维码安全

  • 二维码生成

    • 确认返回的二维码内容仅包含短链,不包含恶意脚本。
  • 下载安全

    • 确认下载文件类型为 image/png 或 image/svg+xml,避免 XSS。

9. 审计与日志

  • 登录失败审计

    • 多次失败登录是否记录日志。
  • 异常访问记录

    • 短链不存在、过期的访问是否记录。
  • API Key 滥用记录

    • 超限/异常调用是否有报警机制。

测试工具

  • SQL 注入/XSS:Burp Suite / OWASP ZAP / sqlmap
  • 恶意 URL 检测:集成 Google Safe Browsing API
  • 压力防刷:JMeter + Gatling
  • CORS/CSRF:Postman + 自定义 JS 脚本

10. 深度威胁建模:STRIDE 与攻击面分析

短链服务看似功能单点,但攻击面覆盖了输入→处理→存储→跳转→展示全链路。用 STRIDE 框架系统拆解:

威胁类别攻击面防御措施
Spoofing(伪装)伪造 JWT / API Key短有效期 Token + 签名算法 HS256 升级至 RS256(非对称签名防密钥泄露)
Tampering(篡改)修改短码映射的目标 URL数据库外键校验 + URL 哈希指纹存储,篡改即失效
Repudiation(抵赖)否认生成过某短链全链路审计日志(用户ID、IP、User-Agent、时间戳)写入不可篡改日志(如 W/ja)
Information Disclosure(信息泄露)遍历短码猜测有效链接短码使用 Base62 8 位随机串(约 218 万亿空间)+ 速率限制
Denial of Service(拒绝服务)高频生成短链耗尽存储空间高级限流 + 用户配额 + 短码 TTL 自动回收
Elevation of Privilege(权限提升)普通用户调用管理员接口RBAC 角色校验中间件,拒绝非管理员 Token 访问管理端点

跳转环节是最易被忽视的放大攻击面。除校验目标 URL 是否在白名单外,还应配置以下安全响应头:

X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Content-Security-Policy: default-src 'self'

11. JWT 安全深度加固

API 层若采用 JWT 认证,以下检查项应纳入安全清单:

检查项合格标准常见漏洞
算法指定Header 中明确 alg: RS256alg: none 绕过认证
密钥轮换定期轮换签名密钥,保留旧密钥 24h 兼容密钥泄露后全局失效
声明校验校验 exp(过期)、nbf(生效前)、iss(签发者)、aud(受众)永不过期 Token 被长期盗用
Token 存储前端存于 httpOnly Secure Cookie,非 localStorageXSS 脚本窃取 Token
签发者隔离管理端与用户端使用不同密钥对用户伪造管理员 Token
// Spring Security JwtDecoder 配置示例
@Bean
public JwtDecoder jwtDecoder() {
    NimbusJwtDecoder decoder = NimbusJwtDecoder
        .withJwkSetUri("https://auth.example.com/.well-known/jwks.json")
        .build();
    OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer("https://auth.example.com");
    OAuth2TokenValidator<Jwt> withAudience = new AudienceValidator("shortlink-api"); // 校验 aud
    decoder.setJwtValidator(withIssuer.and(withAudience));
    return decoder;
}

12. 高级限流与防刷策略

接口限流不仅是拦截高频调用,还应区分用户维度、接口维度和时间窗口:

维度策略实现方式
IP 级单 IP 每分钟 60 次生成Redis INCR + TTL
用户级注册用户 vs 游客差异化配额认证中间件识别用户身份
接口级/api/shorten 比 /api/:code 限流更严格为高频写入接口单独配置 lower rate limit
滑动窗口使用 Token Bucket / Sliding Window Log更精确控制突发流量

Token Bucket 比固定窗口更平滑,允许少量突发:

@Component
public class RateLimiter {
    private final Map<String, AtomicInteger> buckets = new ConcurrentHashMap<>();
    private final int capacity = 10;  // 桶容量
    private final int refillRate = 5; // 每秒补充 5 个令牌

    public boolean allowRequest(String key) {
        AtomicInteger tokens = buckets.computeIfAbsent(key, k -> new AtomicInteger(capacity));
        int current = tokens.get();
        if (current > 0) {
            return tokens.decrementAndGet() >= 0;
        }
        return false; // 超过速率,拒绝请求
    }
}

生产环境推荐使用 Bucket4j 库配合 Redis 实现分布式限流,支持集群间共享令牌桶状态。

13. 应急响应标准流程(SOP)

一旦发生安全事件(如 API Key 泄露、大量恶意短链生成),应执行以下 SOP:

第 1 分钟:检测与确认
  ├── 监控告警触发(异常 QPS、错误率突增)
  └── 值班人员确认事件等级(P0/P1/P2)

第 5 分钟:遏制
  ├── 禁用泄露的 API Key(数据库标记 revoked_at)
  ├── 对涉事 IP 段封禁(WAF / 防火墙规则)
  └── 临时收紧限流阈值(全局 bucket 容量减半)

第 30 分钟:根除
  ├── 扫描并删除已生成的恶意短链(批量更新 status = BLOCKED)
  └── 通知下游黑名单服务(Google Safe Browsing)更新恶意 URL 库

第 2 小时:恢复
  ├── 撤销临时封禁
  └── 逐步恢复限流至正常水平

第 24 小时:复盘
  ├── 输出事件时间线(Timeline)
  ├── 更新威胁模型与防御规则
  └── 补充自动化检测(如新增异常模式监控指标)

14. 合规框架映射参考

合规要求对应检查项证据留存
SOC 2 Type II访问控制、数据加密、变更审计6 个月审计日志
GDPR用户数据删除(Right to Erasure)、数据可携带API 实现 /account/delete,导出 /account/export
等保 2.0 三级身份鉴别、访问控制、安全审计、数据完整性操作日志、备份加密、漏洞扫描报告
PCI DSS密码存储强度、传输加密BCrypt 成本因子 ≥ 10、TLS 1.2+

📌 总结:
这份 安全测试清单 覆盖了:输入安全、认证授权、防注入、防刷、数据保护、日志审计、威胁建模进阶、JWT 深度加固、应急响应 SOP、合规框架映射。
配合之前的功能测试 、性能测试 ,可以形成完整的 DevSecOps 覆盖矩阵。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「prd」更多文章

  1. Kite 关闭案例:AI 编程助手为什么早起飞却没飞远
  2. Powa Technologies 失败案例:宏大支付愿景为什么没有落地
  3. BlueJeans 受挫案例:视频会议早入场,为什么没赢到最后