
1) 【一句话结论】:铁路客票系统API需通过“输入验证+认证+授权+限流+防重放”分层防护,结合API网关实现安全闭环,核心是“输入-认证-授权-防护-网关”的协同设计,全面抵御常见攻击。
2) 【原理/概念讲解】:
^\d{4}-\d{2}-\d{2}$、座位类型限定“一等座”“二等座”),并用参数化查询(避免拼接SQL)或ORM框架(如MyBatis)防止SQL注入。exp)、签名(signature),通过验证签名和exp确保令牌有效性。3) 【对比与适用场景】:
| 对比项 | OAuth2 | JWT |
|---|---|---|
| 定义 | 授权框架,通过令牌授权第三方应用 | 自包含的JSON Web Token,包含声明 |
| 特性 | 有令牌管理(刷新令牌),适合第三方登录 | 无状态,自包含,适合无状态服务 |
| 使用场景 | 第三方应用调用API(如微信登录后调用购票接口) | 后端服务间通信,或单点登录后API调用 |
| 注意点 | 需管理令牌生命周期,防止泄露 | 过期时间设置合理,防止过期后重放 |
| 对比项 | RBAC | ABAC |
|---|---|---|
| 定义 | 基于角色(Role-Based Access Control) | 基于属性(Attribute-Based Access Control) |
| 特性 | 角色固定,权限集中管理 | 权限基于用户属性(如部门、职位、时间) |
| 使用场景 | 铁路系统固定角色(如售票员、退票员) | 更灵活的场景(如根据用户等级调整权限) |
| 注意点 | 角色继承需谨慎,避免权限越权 | 属性数据需实时更新 |
4) 【示例】:以“购票”API为例,请求示例(POST /api/v1/tickets):
{
"train_id": "G101",
"date": "2024-05-20",
"passenger_id": "123456",
"seat_type": "二等座"
}
处理流程:
train_id(非空、格式校验)、date(日期格式)、passenger_id(长度校验)、seat_type(白名单“一等座”“二等座”)。Authorization: Bearer <jwt_token>,解析JWT,验证签名(exp检查是否过期)。nonce(随机数)是否与之前请求匹配,或时间戳是否在5分钟内。5) 【面试口播版答案】:各位面试官好,针对铁路客票系统的API安全防护,我的方案核心是“分层防护+API网关”的闭环设计。首先,输入验证方面,对购票、退票等接口的参数做白名单校验(比如日期用正则^\d{4}-\d{2}-\d{2}$、座位类型限定“一等座”“二等座”),并用参数化查询防止SQL注入。然后认证采用OAuth2授权码模式,用户登录后获取访问令牌,通过JWT签名验证确保令牌有效性(包含过期时间exp)。授权采用RBAC模型,将用户角色(如“售票员”)与权限(“购票”“退票”)绑定,确保角色只能访问对应接口。限流用令牌桶算法控制请求速率(比如每分钟10次),防止DDoS攻击。防重放通过随机nonce+时间戳,确保请求唯一性。最后,所有API通过API网关统一防护,网关负责输入验证、认证、授权、限流、防重放,同时记录日志便于审计。这样能全面覆盖常见攻击,保障系统安全。
6) 【追问清单】:
7) 【常见坑/雷区】: