3.请求安全-- 如何验证请求的唯一性
#如何验证请求的唯一性# ##前言## 讲到请求的唯一性,是我在接口API中开发中遇到的一个问题,有一个需求就当当你的链接被捕获之后如何让它失效,当然是在别人没有破解规则之前!如果别人截取了你的请求可以进行大量请求攻击(防止重复请求攻击(RepeatAttack))而且会跑到逻辑层并不会在拦截器中拦截,我们要做的就是在拦截器避免这种情况,当然实现的方式有很多种
ps:当然是防御不了内容被篡改但是在后面的文章我会减少一种我现在在使用的一套结合起来的请求安全方面来最大可能的避免此类问题
##1.浅谈各项解决方案## ###1.1微信### 微信分为主动请求(比如一个用户向公众号发送了消息要返回什么类容,可以指向专门的自定程序)和接受请求(如微信推送,点对点推送,客服,提醒)
第一种:主动请求
主动请求微信是会有一个机制,绑定URL(服务器地址)绑定服务器地址的话,如果别人不是侵入了你的服务器或者是改变了这个地址的指向基本
很难操作的余地
第二种:接受请求
对于接受的请求来说微信并没有限定必须是摸个特定地址的请求,也就是说任何一台机器都可以请求微信,微信也需要处于安全考虑,别人捕获了
一个推送微信的请求可以不停的访问,这样就可能导致服务器资源被占用正常的用户无法使用或响应时间长(不过对于这种大公司应付这种攻击
的能力是很强的,当然对于小公司来说就不同了,资源有限的情况下最好是可以避免这种拦截请求频繁访问的攻击-攻击也就是所谓的DdoS攻击)
微信几套方式来防止这种问题
1.使用公众号的access_token获取服务器的IP地址列表
2.有效时常access_token用一些凭证获取,在所有的请求都会验证,而且会有失效时间,每天获取的access_token也是有限的
3.所有的被请求的接口都会有对于每个用户次数限制
综合以上基本上就是一个堡垒了,一必须通过服务器验证用户有效性(相当于登录),然后获取动态服务器地址,然后是请求频率限制
但是对于实现实现起来局限比较多,成本相当高也比较复杂.
###1.2大众点评### 大众点评是提供了一套"商家接入层接口"这套接口时提供给服务器与服务器通讯的这点和微信不同 只有一种接受请求
大众点评并没有采用对于请求唯一性的验证,因为是服务器之间的通讯基本可以理解
但是他也使用了一些方法通讯安全的处理方法
1.appKey请求开发者作为请求加解密的参数
2.点评提供给您的开发者token
相对于微信来说点评的这个安全性也许看起来小了很多,但是这是对于服务器与服务器对接的本身内部的安全级别就比较高
##2.一个简单的解决方案介绍## 我推荐的这个方式比较适合,不想花太大成本,又想得到比较好的安全效果人群使用
当然请求唯一性是对于一个用户(在微信里面是appid,在点评里面是appKey)这个都是用户的唯一标示
在这个简单的解决方案中有两个比较重要的东西,随机数,时间戳,通过这两个东西加上用户唯一标示就能实现一套简单的请求唯一性验证
还是一句老话:如何实现是最后一个问题
在这里我还是采用redis键值存储,并且约定除了登录外的所有接口请求是都需带用户唯一标示,所有请求都必须有客户端生成的随机数,时间戳
###2.1用户请求登录接口需要做的操作: 1.通过用户的用户名密码或者一些其他东西获取用户的唯一标示 2.把用户的唯一标示作为key随机数和时间戳作为value保存起来 3.返回用户的唯一标示
###2.2验证请求唯一性时需要做的事情 1.获得用户的唯一标示 2.通过唯一标示获取上次请求的时间戳和随机数 3.验证时间戳是不是比上次请求的时间戳要晚,随机数是不是和前一次随机数相同 同时达到这两个条件时认定请求重复 4.验证通过吧这次的请求随机数和时间戳存入
以上就是基本解决思路,可以给存入的 时间戳和随机数一个过期时间这样当两次请求距离时间过久也一样会过滤掉
- 唐良:云端架构给电商行业带来创新力
- 邹方明:看腾讯云如何架构海量存储系统
- 王之捷:AI智能云端架构大幅提升智能语音识别能力
- 精彩大放送 | 腾讯云:容器架构向无服务架构的演进
- Python 数据分析学习笔记
- 如何用Fiddler抓取https
- 人工智能与大数据结合,帮助降低自杀率
- “多态”的数据库连接池实现
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
- 用js代码理解区块链,最简版本
- 谈谈IE针对Ajax请求结果的缓存
- Ajax请求过程中显示“进度”的简单实现
- ASP.NET MVC基于标注特性的Model验证:ValidationAttribute
- 【深度学习系列】卷积神经网络详解(二)——自己手写一个卷积神经网络
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++抽象工厂
- 数据结构【动态栈】代码实现
- UOS安装chrome谷歌浏览器依赖Fonts-Liberation的问题
- UOS修改盘符名称(像windows的C、D、E盘)
- 【原创】Java并发编程系列29 | ConcurrentLinkedQueue
- UOS系统安装-配置Qt环境
- C++控制台程序接收、解析参数及被如何调用、调试
- C++11标准常用特性---统一初始化
- QPainter的fillRect函数-QGradient-Preset渐变颜色预设值
- 深度学习|Tensorflow2.0进阶
- Mumble——简介及搭建
- 网站开启HSTS增强安全性
- 形式化分析工具(六):HLPSL Tutorial(Example 4,other)
- Typecho回复可见功能
- 微信小程序开发实战(13):图像组件(image)