前端业务需要怎么样的接口,如何保证交互安全
本篇不是RESTful风格的描述,提供思路仅供参考
https
防抓包不用多说
格式规范JSON
对一个项目来说,统一格式的返回数据,前后端可以进行优雅抽象,简洁处理业务代码
对一个团队来说,统一格式,可以封装通用类,作为沉淀
1 | { |
token
访问令牌字符串,用于标识客户端的身份
服务端返回appid和key,(这里的客户端是指接口的请求方,服务端是指接口的处理方),这个key需要保存到客户端,并作安全处理
举例抖音的signature,我还没找到是如何生成的(知道的小伙伴可以下方留言告诉我)
token作为key,关联信息作为value,缓存到redis中,当请求处理时检查token存在及过期时间,否则返回异常
API token 接口令牌
访问不需要登录的数据,比如登录注册,基本数据获取
通过appid、timestamp、sign来换token
USER toekn 用户令牌
访问登录后的数据,用户信息,增删改
通过用户名、密码来换token
时效性
- 一次性
- 调用后销毁
- 过期时间
- 20分钟~2小时
- 过期后激活并续期
- 用旧token请求,返回新token,延长过期时间,下次用新token
timestamp
接口调用时的客户端时间戳,缩短Dos攻击时间
服务端判断时间差或者解析sign在几分钟内通过,以外的拦截过滤掉
Dos是指利用网络协议层的缺陷,大量请求服务器资源、占用带宽、填充硬盘空间,导致服务器无法正常工作,直至停止响应崩溃
- 简述Dos方式
- Pingflood Ping包,堵塞网络&主机资源
- Synflood SYN包,收到主机ACK不回应,建立维护大量连接队列,消耗主机资源
- Smurf ICMP包,伪装客户端为目标主机地址,向子网广播地址发包,使子网主机回应目标主机,形成攻击
- Land-based 设置包的源地址和目标地址为主机地址,通过ip欺骗方式发给目标主机,造成与自身建立连接的死循环
- Ping of Death 包长度分割片段,总和大于65536字节上限,造成宕机
- Teardrop 包分割小片段,使合并前分配大量资源堆栈
sign
参数签名,防止篡改
ascii码升序+token+key+timestamp+随机数,加密
可以放在请求体中,也可以放在header中,即使参数被修改,通过sign解析在接收时验证
(有人说sign是骗自己,没有增加防护效果,这里再提一次,抖音的signature是怎么加密的呢)
重复提交
前端做请求触发的拦截
后端设置超时时间
- 第一次提交时sign保存、超时时间
- 第二次请求时检测是否存在sign
- 存在为重复提交,因为如果sign过期token也会过期
增加装饰器自定义接口防重功能
使用
前端
- 客户端申请appid和key
- 客户端携带appid、timestamp、sign获取服务端api token
- 客户端请求普通接口
- 客户端登录,用户名密码换取user token
- 客户端请求权限接口
后端
Thread多线程,单个线程中,方法共享内存,能从上下文取值
- api接收参数时,拦截器校验token合法
- 找到token对应的用户信息,存储到Thread中,这样在生命周期中都能获取到
文档工具
Swagger / Yapi / Postman / Online&Offline Website / Excel / PPT / Word