防止接口访问过程请求重放攻击

重放攻击,类似WEB表单的重复提交,接口的访问者使用同样的消息体不断访问接口提供者的过程,从而导致接口提供者压力变大甚至服务器故障、数据丢失等。

防止重放攻击的一般做法是请求方和提供方约定一个唯一的TID,请求方携带此ID,提供方校验ID。常见的几种做法:

1、请求方每次从提供方申请一个唯一的TID

工作过程:

  • 请求方申请TID
  • 请求服务器时携带此TID
  • 提供方对TID进行鉴权,通过则继续

这种方法简单,但是交互次数需要翻倍,而且TID量会很大,管理TID存在问题。

2、由客户端生成唯一的TID,如使用UUID生成方法

提供方判断UUID是否使用过,没有使用过则判定可以继续,否则中断处理

这种方法更简单,但是服务提供方如何保存如此多的UUID是一个严重的挑战。

中国移动的M币系统就是采用这种方法构建,那个处理能力只能呵呵了。

3、申请密钥KEY并加上唯一的Sequence解决

原理

  • 请求方的每台机器甚至每个进程分发一个唯一的ClientCode
  • 请求方向服务提供方申请一个KEY,服务提供方保留ClientCode、Key的对应关系,并默认对应的ServerSeq=1
  • 请求方访问接口的HTTP头中增加AuthCode=AES(ClientCode+ClientSeq, KEY)和ClientCode两个HTTP Header
  • 服务提供方收到请求,根据ClientCode找到服务端存储的ClientCode、Key和ServerSeq组合,使用Key对AuthCode解密,比对ClientSeq=ServerSeq+1,如满足,则校验成功,继续处理,否则中断

优势,一次请求,多次访问,安全有效。

请求方多线程/线程池的处理:

创建一个简单ClientCodePool,缓存所有的ClientCode和状态,伪码如下:

Class ClientCodePool {

Set<ClientCode> clientCodes;

ClientCode getFreeClientCode();

Void releaseClientCode(ClientCode)

Void applyNewClientCode()

Class ClientCode{

String clientCode;

String key

Long clientSeq

Boolean isFree

}

}

无论哪个线程,需要clientcode就从pool中获取,服务端返回后,release这个ClientCode即可,在申请后返回前,ClientCode.isFree=false的,release后ClientCode.isFree=true

提供方也存在一些公共数据的问题,最好是采用Zookeeper统一存储,当然如果要求不高,使用redis也行,毕竟既是校验失败了,客户端重新申请一次ClientCode的key即可。

时间: 2024-11-12 01:55:44

防止接口访问过程请求重放攻击的相关文章

轻型的接口访问频率限制服务模型的设计与实现【转】

原文地址:http://www.iam3y.com/html/878.html 最近需要设计open api的接口频次控制相关实现,便查阅相关文档. 接口频次控制主要包括两方面: (1)业务ID对某一个接口某时间间隔(如一分钟)内访问的次数 限制 (2)业务ID在某个时间周期(如一天)内访问的次数 限制 对于存储并进行频次计数的服务来说,要具备以下的特点: (1)自更新能力,在某个约定的时间点对所有的node(节点)进行自更新操作,也就是常说的出厂设置 (2)协议轻型能力,协议必须尽可能简单,才

zabbix监控WEB端项目(接口访问)

今天记录一下公司要求的监控部分项目使用接口的访问情况(主要是接口是否正常工作) 这个需求之前有做过代码监控实现,但是过程比较繁琐,需要用到requests模块然后调用外部EXCEL,EXCEL中记录接口请求相关数据 但是这个需求中只需要监控接口是否正常使用就行,所以只需要检验接口访问范围状态码是否是200就可以,那么zabbix完全可以做到 1.首先创建一个web监控:监控内容中添加接口请求地址(目前需求不需要添加参数) 2.增加校验状态码是否是200 3.添加触发器,这里选择触发器监控项的时候

SpringBoot应用中使用AOP记录接口访问日志

SpringBoot应用中使用AOP记录接口访问日志 本文主要讲述AOP在mall项目中的应用,通过在controller层建一个切面来实现接口访问的统一日志记录. AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP的相关术语 通知(Advice) 通知

接口、HTTP请求、协议、响应(总结加深印象)

一.什么是接口 硬件接口比如:USB.耳机.水龙头.电灯泡 软件接口比如:api.github.com 连接了服务端和客户端. UI  user interface 用户接口. 用户界面. 函数 可以公开访问的才能是接口 . API  全称:application programming interface,应用程序可编程接口,应用程序写代码,可以控制的接口 连接了两个不同的事物.系统,可以进行数据传输 . 接口,两个不同事物之间进行适配的一种工具,规范和协议, 二.什么是网络请求 1.客户端 

HTTP协议详解以及URL具体访问过程

1.简介 1.1.HTTP协议是什么? 即超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准.从网络参考模型来看,它是属于应用层.它规定了计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. 简单的来说,它就是基于应用层一个规范一个标准!通讯双发都需要遵守这一准则,这就是http协议! 1.2.http简史

asp.net mvc,基于aop实现的接口访问统计、接口缓存等

其实asp.net 上aop现有的框架应该蛮多的,比如静态注入式的PostSharp(新版本好像已经商业化了,旧版本又不支持.net4.0+),或者通过反射的(性能会降低). 本文则是通过mvc其中一种方法拦截器ActionFilter(参考网上已经有很多类似例子). 首先新建一个日志控制类,命名为ApiLogAttribute,继承于ActionFilterAttribute /// <summary> /// 记录访问日志以及站点安全检查 /// </summary> publ

(6)s3c2440用I2C接口访问EEPROM

在前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来,最后还是放弃了.甚至参考了linux下i2c-algo-bit.c和i2c-gpio.c,依然没调出来.如果有示波器,可能很快就能找到原因,现在完全不知道问题出在哪里.其实想用GPIO模拟I2C的目的很简单,以一种简单而又深刻的方式来理解I2C. 既然这条路暂时没法走,退而求其次,用s3c2440的

ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限

开发了一个导入TXT文件的功能,执行过程中出错.提示:.....ASP.NET 未被授权访问所请求的资源.请考虑授予 ASP.NET 请求标识访问此资源的权限.ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS 5 上为 {MACHINE}\ASPNET,在 IIS 6 上为网络服务).如果应用程序正在通过 <identity sonate="true"/> 模拟,则标识将为匿名用户(通常为IUSR_MACHINENAME)或经过身份验证的请求用户

以Apache服务器、php语言为例 详解动态网站的访问过程

目前来说,网站页面主要分为静态页面和动态页面,纯静态页面组成的网站现在相对比较少见,大型网站一般使用的是动态网站建站技术,还有一部分网站是静态网页与动态网页共存, 本文以Apache服务器.php语言为例,详解动态网站的访问过程,下面直接切入本文主题. (1)用户端访问服务器端的html文件 S1:通过本机配置好的DNS域名服务器地址寻找DNS服务器,将网站URL中的Web主机域名解析为Web服务器所在的Linux操作系统(Apache通常与Linux操作系统组合使用)中对应的IP地址. S2: