在项目上线后,后台接口很容易通过抓包工具看到, 难免被人为构造恶意请求攻击我们的系统,相信大家都或多或少都遇到过短信验证码被刷、疯狂留言灌水、数据被恶意爬取等问题,这种直接抓接口然后写个循环调用的行为门槛极低,本文重点提供一种提高安全门槛的方法供大家参考。

 
后台接口很容易暴露

1.实现思路:
客户端通过将本地时间戳client_time_sign加密传给后台,后台通过解密后和服务端时间server_time进行对比,在有效时间范围内的话则说明是有效请求

 
流程图

2.改造点:
老接口请求方式: http://www.abc123.com/getUserInfo?id=1
新接口请求方式: http://www.abc123.com/getUserInfo?id=1&client_time_sign=MEejo6tNI0aVlRrcKdOqDZAf
原来老接口抓到URL地址后可以任意调用,新接口URL地址调用过一次后,第二次再调用会提示请求非法,即使抓到了也不能重复发起请求。

2.1.前端控制器
在APP或者WEB应用的接口请求工具类或者拦截器中,拼接上client_time_sign参数,规则是直接对客户端本地时间做AES加密(简单做法,可以修改为非对称RSA加密或者使用更多盐值一起加密)

2.2.后端拦截器
后端收到request请求后,获取client_time_sign,通过服务端对参数AES解密拿到本次请求的客户端时间戳,和服务端时间戳进行对比,server_time - client_time < ${legal_time} ,有效时间可以根据系统自身需要调高或调低,例如设置为10s ,意思就是请求有效时间持续10秒, 在10秒内这个URL可以重复请求。
如果条件不成立,则可以直接返回异常提示给请求方。

注意事项:
这种实现方式有一个地方需要考虑,就是客户端时间可能不一样,本地时间是可以随便被修改的,可能会导致正常请求无法被处理,这种情况下需要补正客户端时间差,做法是在后端接口返回值字段中增加一个服务端系统时间server_time, 客户端计算与服务端时间差值,补齐后再进行加密。

//客户端时间补正方法
var globle = 0; //全局,并在app启动时生成
function getGloble(sys_timestamp){ //入参为后台返回体中的t_
if(globle == 0){
var timestamp = (new Date()).getTime();
globle = sys_timestamp - timestamp
}
return globle ;
}

  

按照方案改造后, 只有自己的客户端知道规则, 其他不知道校验规则的拿到URL地址也没用, 这样基本能避免90%的滥刷接口行为。

历史文章:
JAVA微信企业付款到零钱(十分钟搞定)
微信授权获取用户openId的方法和步骤
一个微信号同时支持多个环境网页授权
微信两种签名算法MD5和HMAC-SHA256

一种简单的REST API接口加密实现,只允许自己的产品调用后台,防止接口被刷的更多相关文章

  1. 一种简单的md5加盐加密的方法(防止彩虹表撞库)

    md5加密(或者说摘要算法)大家都很熟悉了 就不解释了 现在很多数据库设计都喜欢用单向加密的方式保存密码,验证时对提交的密码再次加密之后做密文对比 /// <summary> 使用MD5加 ...

  2. 一种简单有效的VBA源代码加密办法,支持64位宿主,适用于大部分VBA代码加密

    原始出处:http://www.cnblogs.com/Charltsing/p/EncryptVBACode.html VBA代码加密是个老生常谈的问题,自从本人的VBA Dumper发布之后,在O ...

  3. Vue实例中封装api接口的思路 在页面中用async,await调用方法请求

    一般我们写小型的项目是用不到封装axios实例 但是当我们写大型项目时  接口有时候多到有上百个接口,那我们在请求一次调用一次接口,接口上好多都是重复的,这个时候我们就可以封装axios实例,既节省了 ...

  4. python接口自动化(三十五)-封装与调用--流程类接口关联(详解)

    简介 流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便.在这里我们还是以博客园为例,带着小伙伴们实践一下. 接口封 ...

  5. Qt插件开发入门(两种方法:High-Level API接口,Low-Level API接口)

    Qt中为我们提供了两种开发插件的方式.一种是使用High-Level API接口,一种是使用Low-Level API接口.所谓High-Level API 是指通过继承Qt为我们提供的特定的插件基类 ...

  6. 接口加密《二》: API权限设计总结

    来源:http://meiyitianabc.blog.163.com/blog/static/105022127201310562811897/ API权限设计总结: 最近在做API的权限设计这一块 ...

  7. API接口加密方式说明

    标签: 接口 2016年10月11日 19:41:20 13299人阅读 评论(0) 收藏 举报  分类: API(5)  版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog ...

  8. http接口加密《一》:移动应用中,通过在客户端对访问的url进行加密处理来保护服务器上的数据

    来源:http://meiyitianabc.blog.163.com/blog/static/10502212720131056273619/ 我认为,保护服务器端的数据,有这么几个关键点: 不能对 ...

  9. Java对接拼多多开放平台API(加密上云等全流程)

    前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...

随机推荐

  1. Elasticsearch(GEO)数据写入和空间检索

    Elasticsearch简介 什么是 Elasticsearch? Elasticsearch 是一个开源的分布式 RESTful搜索和分析引擎,能够解决越来越多不同的应用场景. 本文内容 本文主要 ...

  2. ORACLE数据库中执行计划出现INTERNAL_FUNCTION一定是隐式转换吗?

    ORACLE数据库中,我们会使用一些SQL语句找出存在隐式转换的问题SQL,其中网上流传的一个SQL语句如下,查询V$SQL_PLAN的字段FILTER_PREDICATES中是否存在INTERNAL ...

  3. Unity Ruby's Adventure 第一步

    官方游戏教程:https://learn.unity.com/project/ruby-s-2d-rpg?language=en 鲁比大冒险是一个2D游戏入门教程,涉及动画,特效,UI,瓦片地图,音效 ...

  4. RBAC-权限管理设计

    1.RBAC(Role-Based Access Control)——基于角色的访问控制.简单来说每个角色有不同的权限,通过对用户赋予不同角色来赋予其对应权限. 2.RBAC0:最基本的用户角色多对多 ...

  5. Git 原理简谈

    Git 本身是一个对 reference 进行管理的数据库,reference 指的是对原始数据的引用.通过对原始数据的追踪,那么就可以做到对版本的控制.Git 使用一个 DAG 存储了整个的refe ...

  6. 亚马逊写作文档tip

    亚马逊的文档要求任何一份开会备忘录/要点备忘录都需要控制在4页左右,Jeff 自己也强调过,4页的备忘录比20页的备忘录要求的更高,它不仅需要更好的思考,也需要对开会讨论各个重点之间关系的理解.ppt ...

  7. Path Manipulation 路径操作

  8. 【系统之音】SystemUI篇(二)SysytemUI功能一览--草稿

    Main Menu > Navigate > Type Hierarchy(Ctrl + H)

  9. 流式计算(二)-Kafka Stream

    前面说了Java8的流,这里还说流处理,既然是流,比如水流车流,肯定得有流的源头,源可以有多种,可以自建,也可以从应用端获取,今天就拿非常经典的Kafka做源头来说事,比如要来一套应用日志实时分析框架 ...

  10. Python3 pickle模块用法

    pickle(python3.x)和cPickle(python2.x的模块)相当于java的序列化和反序列化操作. 常采用下面的方式使用: import pickle pickle.dump(obj ...