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

 
后台接口很容易暴露

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. C#字符串与时间格式化

    需要将其它类型的变量,转换为字符串类型的一些常见方法与属性. 字符型转换为字符串 // C 货币 2.5.ToString("C"); // ¥2.50 // D 10进制数 .T ...

  2. 《Dotnet9》系列之建站-中文站最好WordPress主题,自媒体,博客,企业,商城主题一网打尽

    大家好,我是Dotnet9小编,一个从事dotnet开发8年+的程序员.本文介绍WordPress主题JustNews,本站Dotnet9既是使用WordPress + JustNews主题搭建而成的 ...

  3. Linux之shell详解

    Shell是什么 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界 ...

  4. 使用 ASP.NET Core MVC 创建 Web API——响应数据的内容协商(七)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  5. NLP标记集资料

    title: 标记集 tags: grammar_cjkRuby: true --- LTP分词标注集 标记 含义 举例 B 词首 __中__国 I 词中 哈__工__大 E 词尾 科__学__ S ...

  6. Spring Cloud系列:不重启eureka,清除down掉的服务

    场景描述 做项目的时候,我的服务改了个ip,然后重新启动后,原ip的服务down掉了,但是没有清楚掉,还在上面,导致我用swagger测试的时候,访问不到真正up的程序.重启eureka又不划算,于是 ...

  7. CSS(2)---css字体、文本样式属性

    css字体.文本样式属性 这篇主要讲CSS文本属性中的:字体样式属性 和 文本样式属性. 一.字体样式属性 CSS 字体属性主要包括:字体设置(font-family).字号大小(font-size) ...

  8. Android 程序分析环境搭建-Android 9 -代码下载编译

    Android 9 -代码下载编译 一,翻墙下载: 1.背景: 背景: 现在Android framework 开发的同学,整体在公司里面解一些无关痛痒的bug,对于Android framework ...

  9. Windows添加自定义开机用户登录启动程序

    默认的启动程序 Ctrl+shift -> Esc调用任务管理器-->启动项选项即可完成计算机开机自启动选项,不过这里只有系统默认添加的. 添加自定义开机启动程序 Windows+R调用运 ...

  10. LeetCode刷题191125

    博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 今天状态不好,划一下水. 算法: 给定一个整数数组 nums 和一个目标 ...