原文:https://www.lanshiqin.com/ef4382ec/

写了这么多接口,是否考虑过 api 接口安全问题呢?

API重放攻击(Replay Attacks)又称重播攻击、回放攻击。他的原理就是把之前窃听到的数据原封不动的重新发送给接收方。HTTPS并不能防止这种攻击,虽然传输的数据是经过加密的,窃听者无法得到数据的准确定义,但是可以从请求的接收方地址分析出这些数据的作用。比如用户登录请求时攻击者虽然无法窃听密码,但是却可以截取加密后的口令然后将其重放,从而利用这种方式进行有效的攻击。

所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,重放攻击是计算机世界黑客常用的攻击方式之一。

一次HTTP请求,从请求方到接收方中间要经过很多个路由器和交换机,攻击者可以在中途截获请求的数据。假设在一个网上存款系统中,一条消息表示用户支取了一笔存款,攻击者完全可以多次发送这条消息而偷窃存款。

重放是二次请求,如果API接口没有做对应的安全防护,将可能造成很严重的后果。

API接口常见的安全防护要做的主要有如下几点:

  • 防止sql注入
  • 防止xss攻击
  • 防止请求参数被串改
  • 防止重放攻击

主要防御措施可以归纳为两点:

  • 对请求的合法性进行校验
  • 对请求的数据进行校验
防止重放攻击必须要保证请求仅一次有效
需要通过在请求体中携带当前请求的唯一标识,并且进行签名防止被篡改。
所以防止重放攻击需要建立在防止签名被串改的基础之上。

请求参数防篡改

采用https协议可以将传输的明文进行加密,但是黑客仍然可以截获传输的数据包,进一步伪造请求进行重放攻击。如果黑客使用特殊手段让请求方设备使用了伪造的证书进行通信,那么https加密的内容也将会被解密。
在API接口中我们除了使用https协议进行通信外,还需要有自己的一套加解密机制,对请求参数进行保护,防止被篡改。
过程如下:

  1. 客户端使用约定好的秘钥对传输参数进行加密,得到签名值signature,并且将签名值也放入请求参数中,发送请求给服务端
  2. 服务端接收客户端的请求,然后使用约定好的秘钥对请求的参数(除了signature以外)再次进行签名,得到签名值autograph。
  3. 服务端对比signature和autograph的值,如果对比一致,认定为合法请求。如果对比不一致,说明参数被篡改,认定为非法请求。

因为黑客不知道签名的秘钥,所以即使截取到请求数据,对请求参数进行篡改,但是却无法对参数进行签名,无法得到修改后参数的签名值signature。
签名的秘钥我们可以使用很多方案,可以采用对称加密或者非对称加密。

防止重放攻击

基于timestamp的方案

每次HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,是否超过了60s,如果超过了则认为是非法的请求。

一般情况下,黑客从抓包重放请求耗时远远超过了60s,所以此时请求中的timestamp参数已经失效了。
如果黑客修改timestamp参数为当前的时间戳,则signature参数对应的数字签名就会失效,因为黑客不知道签名秘钥,没有办法生成新的数字签名。

但这种方式的漏洞也是显而易见的,如果在60s之后进行重放攻击,那就没办法了,所以这种方式不能保证请求仅一次有效。

基于nonce的方案

nonce的意思是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,所以该参数一般与时间戳有关,我们这里为了方便起见,直接使用时间戳的16进制,实际使用时可以加上客户端的ip地址,mac地址等信息做个哈希之后,作为nonce参数。
我们将每次请求的nonce参数存储到一个“集合”中,可以json格式存储到数据库或缓存中。
每次处理HTTP请求时,首先判断该请求的nonce参数是否在该“集合”中,如果存在则认为是非法请求。

nonce参数在首次请求时,已经被存储到了服务器上的“集合”中,再次发送请求会被识别并拒绝。
nonce参数作为数字签名的一部分,是无法篡改的,因为黑客不清楚token,所以不能生成新的sign。

这种方式也有很大的问题,那就是存储nonce参数的“集合”会越来越大,验证nonce是否存在“集合”中的耗时会越来越长。我们不能让nonce“集合”无限大,所以需要定期清理该“集合”,但是一旦该“集合”被清理,我们就无法验证被清理了的nonce参数了。也就是说,假设该“集合”平均1天清理一次的话,我们抓取到的该url,虽然当时无法进行重放攻击,但是我们还是可以每隔一天进行一次重放攻击的。而且存储24小时内,所有请求的“nonce”参数,也是一笔不小的开销。

基于timestamp和nonce的方案

nonce的一次性可以解决timestamp参数60s的问题,timestamp可以解决nonce参数“集合”越来越大的问题。
防止重放攻击一般和防止请求参数被串改一起做,请求的Headers数据如下图所示。

基于以上的方案就可以做到防止API接收的参数被篡改和防止API请求重放攻击。

【API 接口设计】重放攻击相关推荐

  1. API接口设计最佳实践

    目录 目录 前言 API接口设计 Token设计 API接口设计原则 1.明确协议规范 2.统一接口路径规范 3.统一接口版本管理 4.为你的接口设定调用门槛 5.接口返回规范 6.接口安全规范 7. ...

  2. API接口设计之RESTful软件架构风格

    说到API接口设计有的喜欢用Web Service,有的喜欢用WCF,当然也有还在用最原始的ashx,aspx页面的.无论采用什么方式能很好的满足业务需求就ok,但是不同的方式在扩展性.易用性,可维护 ...

  3. 16. 设计模式之契约原则:如何做好 API 接口设计?

    一.契约式设计原则:API 设计的指导书 无论是架构设计还是编码实现,现在都越来越离不开接口设计,接口可以说是新时代的"集装箱",是得到了几乎所有人一致共识的通用标准. GoF 在 ...

  4. API接口设计,需要注意这4点

    原文 | http://www.woshipm.com/pd/2772820.html 原则上API接口设计一般出现在开发的详细设计中,但是随着诸多公司建立开放平台,产品经理也逐渐需要能理解API接口 ...

  5. API接口设计 注意问题

    摘要: 总结一下API接口开发过程中的注意事项 1.跨平台性 所谓跨平台是指我们的接口要能够支持不同的终端,比如Android.iOS.windowsphone以及桌面软件.网站等.如:不同的终端每页 ...

  6. 优秀的API接口设计原则及方法

    一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...

  7. API 接口设计中 Token 类型的分类与设计

    在实际的网站设计中我们经常会遇到用户数据的验证和加密的问题,如果实现单点,如果保证数据准确,如何放着重放,如何防止CSRF等等 其中,在所有的服务设计中,都不可避免的涉及到Token的设计. 目前,基 ...

  8. api接口设计相关总结

    写过不少接口,不过一直没有去总结,网上搜了一下,大同小异,此文根据以下几个链接整理修改: https://segmentfault.com/a/1190000004051246 http://blog ...

  9. php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

    2016年12月29日13:45:27  关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restf ...

最新文章

  1. 看看那些来自电路造型挑战赛中的作品
  2. WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml
  3. pythonweb开发-手把手教你写网站:Python WEB开发技术实战
  4. K折交叉验证(StratifiedKFold与KFold比较)
  5. 小程序入门系列之 tabBar
  6. ref 和out 关键字
  7. Python:字典列表字符串方法测试
  8. ASP.NET Core利用拦截器 IActionFilter实现权限控制
  9. 在开启kerberos 后,hbase存在数据命名空间的问题(解决方案)
  10. Flutter实战之底部导航栏 BottomNavigation
  11. SAS安装后处理错误的解决方法
  12. 本地快速搭建FTP服务器
  13. IEC 60664-1-2020【现行】低压供电系统内设备的绝缘配合第1部分:原则、要求和试验
  14. linux aria2 多线程,Mac/Linux 多线程下载解决方案(Aria2 YAAW是什么)
  15. 黑客攻击_我如何开始黑客攻击
  16. 百度大脑人脸离线识别SDK Windows版
  17. 曾用心并深度参与的一款游戏今天发布了关服通知,回顾一下我最初的工作日报
  18. 印象派绘画在现代艺术发展中的地位和作用
  19. 利用Redis的Geo功能实现查找附近的位置!
  20. ReadMe 好看指南

热门文章

  1. #电商#国内外电商网站
  2. 《Oracle 入门教程》第 09 篇 CASE 表达式
  3. vue-monaco-editor的使用
  4. linux驱动绑定设备 命令 bind,Linux设备驱动节点里的bind与unbind
  5. python例程:玛丽冒险
  6. 0x80070570文件或目录损坏且无法读取CHKDSK修复方法
  7. 萌新熟悉一下csdn
  8. HTTP安全问题,通信加密和通信内容加密
  9. SSM框架河洛文化科普宣传网站的设计与开发源码
  10. 初等概率论期中复习(1)基本概念