1. 输入校验与防注入
SQL 注入
- 在生成短链 API 中输入恶意 URL:
https://abc.com' OR '1'='1 - 在搜索接口传入注入语句:
s.io/abc123' UNION SELECT ... - 预期:系统返回参数错误(100001),无数据泄露。
- 在生成短链 API 中输入恶意 URL:
XSS 攻击
- 输入长链为:
<script>alert(1)</script> - 前端展示时是否被执行。
- 预期:系统对 URL 做转义,前端仅展示字符串,不执行脚本。
- 输入长链为:
HTML 注入
- 自定义短码输入 HTML 标签:
<b>shop</b> - 预期:保存失败,提示「短码不合法」。
- 自定义短码输入 HTML 标签:
2. 恶意短链检测
黑名单域名
- 输入 URL 来自钓鱼域名 → 返回错误码
120003。
- 输入 URL 来自钓鱼域名 → 返回错误码
恶意内容检测
- 测试接入 Google Safe Browsing / 腾讯网址安全服务。
- 预期:恶意 URL 阻止生成短链。
3. 认证与鉴权
未登录访问
- 尝试调用需要登录的 API(如
/api/list)。 - 预期:返回
110004(Token 无效/过期)。
- 尝试调用需要登录的 API(如
权限越权
- 用户 A 尝试删除用户 B 的短链。
- 预期:返回
110005(权限不足)。
API Key 管理
- 过期的 API Key 调用 → 返回
130001(Key 无效)。 - 已删除的 Key 调用 → 返回
130001。 - 短时间内高频调用 → 返回
130003(超限)。
- 过期的 API Key 调用 → 返回
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: RS256 | alg: none 绕过认证 |
| 密钥轮换 | 定期轮换签名密钥,保留旧密钥 24h 兼容 | 密钥泄露后全局失效 |
| 声明校验 | 校验 exp(过期)、nbf(生效前)、iss(签发者)、aud(受众) | 永不过期 Token 被长期盗用 |
| Token 存储 | 前端存于 httpOnly Secure Cookie,非 localStorage | XSS 脚本窃取 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 覆盖矩阵。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。