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.验证通过吧这次的请求随机数和时间戳存入

以上就是基本解决思路,可以给存入的 时间戳和随机数一个过期时间这样当两次请求距离时间过久也一样会过滤掉

时间: 2025-01-21 00:59:11

3.请求安全-- 如何验证请求的唯一性的相关文章

xl2tp vpn dns 客户端-求教:xl2tpd建立客户端,在ipcp中只有ip地址请求,没有dns请求。怎么把dns请求添加进去

问题描述 求教:xl2tpd建立客户端,在ipcp中只有ip地址请求,没有dns请求.怎么把dns请求添加进去 解决方案 解决方案二:

ajax 请求参数为空请求是json,有参数就变成HTML 导致请求失败

问题描述 ajax 请求参数为空请求是json,有参数就变成HTML 导致请求失败 如题: $.ajax({ type : "post", url : url, dataType : 'json', data : param, error : function(data) { alert("AJAX查询数据失败."); }, success : function(data) { var entity = data.data; // 获取模板 var source =

mybatis性能优化二之多对多查询:用一次请求解决n次请求查询

<resultMap type="com.cn.vo.Teacher" id="teacher"> <id property="id" column="id" javaType="int" jdbcType="INTEGER" /> <result property="name" column="name" javaT

ajax-服务器端判断了request来自Ajax请求(异步)还是传统请求(同步),怎么办?

问题描述 服务器端判断了request来自Ajax请求(异步)还是传统请求(同步),怎么办? 我猜测服务器端通过x-requested-with 请求头限制了ajax请求,请参照http://holdbelief.iteye.com/blog/528114我是在开发一个chrome插件,我目前使用ajax就获取不到json了,我应该怎样绕过限制呢? 解决方案 request.setRequestHeader http://www.cnblogs.com/chenxizhang/archive/2

请求网络数据-怎么请求聚合数据的数据,求一个demo,谢谢各位大神

问题描述 怎么请求聚合数据的数据,求一个demo,谢谢各位大神 我自己做的请求不出来数据,下面上一个类的代码.请大神指点指点 package com.action; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.i

ajax 异步 拦截-ajax请求拦截,异步请求拦截不到

问题描述 ajax请求拦截,异步请求拦截不到 我想要在页面的所有ajax请求发出去之前和数据返回到页面上之前做一次拦截, 在发出去之前对请求参数做处理再发送,数据回来后对返回数据做处理再返回. 我用XMLHttpRequest谢了一段js代码做拦截,在发出去之前都没有问题,但是数据回来 后如果是异步的请求就拦截不到,比如用jQuery ajax发异步的请求,数据回来后就直接 进入success了,没有进入拦截器.简单的说就是onreadystatechange没有触发,请问 大家该怎么处理啊?纠

war包提交到sae后请求失败(post请求本地测试是正确的,微信公众平台开发)

问题描述 war包提交到sae后请求失败(post请求本地测试是正确的,微信公众平台开发) 121.32.130.122 [10/Jul/2014:11:33:38 +0800] JAVA_SAE_Fatal_error: /coreServletjava.lang.NullPointerException at org.kxw.weixin.servlet.CoreServlet.doPost(CoreServlet.java:59) at javax.servlet.http.HttpSer

restclient火狐插件 以post方式请求,多个请求参数该怎么写

问题描述 restclient火狐插件 以post方式请求,多个请求参数该怎么写 1C 如题,来大婶 restclient火狐插件 以post方式请求,多个请求参数该怎么写? 解决方案 {""id"":""1""name"":""haha""}用这样的JSON形式

c# winform 请求post 带参数 请求网址

问题描述 c# winform 请求post 带参数 请求网址 c# winform 请求post 带参数 请求网址 例如:这是它post请求的网址 :www.baidu.xxx.xxx.html 请求的的正文是 Uname= //后面自己传的参数 成功状态返回1 怎么实现呢 解决方案 http://www.cnblogs.com/xssxss/archive/2012/07/03/2574554.html 解决方案二: bobo的文章很详细,注意设置x-www-form-urlencoded,