给裸接口加一道防护,避免恶意盗刷和爬取

WEB应用是开放的,WEB前端代码也是公开的,和后端交互的接口如果没有经过特殊处理(加密/token),那么就是裸露的,只要知道api地址,那么就能随便获取应用数据。这样应用数据就很容易被人爬取或者恶意盗刷,典型的短信被恶意盗刷。

公司理财产品的短信接口就是一个裸接口,只要手机号就可以任意盗刷,当然背后有根据手机号,ip地址做了请求限制,但还是不够。后面就加了一定时间内一定请求次数的Token,后面观察,基本没有被刷的迹象,说明新的机制还是起到很大作用。当然这个机制不仅是用于防短信盗刷,可用于任意的裸接口防护。

原理很简单,就是在web页面请求的时候由后端按一定的算法注入token到页面中去,然后前端可以通过对应的规则取到token,在请求接口数据时带上去就能在后端对token进行验证,验证通过就能正常请求到数据。如果是native app ,可通过加密的方法请求接口来获取token,最简单直接的方式就是native app 客户端使用一段字符串+时间戳(从后端获取)进行加密,然后请求后端接口,接口对数据进行解密,对时间戳对比,在一段时间内认为有效(避免加密信息被拦截,所以加了时间戳校验),从而获取token。

当然web应用都是公开的,所有源码理论上都是能获取到的。那么后端向web页面注入token的方式也能被破解,所以,后端注入token的形式可定制,比如注入到请求,或者自己实现一套算法,增加被破解的难度。

把这套机制整理成一个独立的npm包[access-token-api](https://github.com/navyxie/access-token-api),方便多项目复用。

使用例子:

npm install access-token-api

//server(nodejs) 端

var accessTokenApi = require(‘access-token-api‘);
var TokenApi = new accessTokenApi({
webTokenVarName:‘encrypt_api_tokenStr‘,//前端可通过webTokenVarName变量去到token值,默认encrypt_api_tokenStr
});

//web前端取token值
window[webTokenVarName] //请求接口时带上这个值就能进行token校验了

  

主要接口

生成token api `issue`
验证token api `verify`
token 有效次数减一 api `decline`

server 端 将token 注入到 web 前端页面 api `webInject`

自定义后端注入token到web前端页面的方式,可以初始化模块时自定义webInject参数(函数)

var TokenApi = new accessTokenApi({
webInject:function(html,token,callback){
var htmlEndIndex = html.indexOf(‘</html>‘);
var tokenScript = ‘<script>window.‘ + this.config.webTokenVarName + ‘=‘ + token + ‘</script>‘;
var prevHtml = html.substring(0,htmlEndIndex);
var nextHtml = html.substr(htmlEndIndex);
prevHtml += tokenScript;
prevHtml += nextHtml;
callback(null,prevHtml);
}
});

  

项目地址[https://github.com/navyxie/access-token-api],里面有express和sails框架的使用例子,抛砖引玉。

时间: 2025-01-04 21:23:42

给裸接口加一道防护,避免恶意盗刷和爬取的相关文章

前后端分离,如何防止接口被其他人调用或恶意重发

前后端分离,如何防止接口被其他人调用或恶意重发? 首先,http协议的无状态特性决定了是无法彻底避免第三方调用你的后台服务.我们可以通过crsf.接口调用频率.用户行为分析(来源等)等各个方面来增加第三方调用的难度,也可以通过添加一个中间层比如node.js来实现:1. 非法访问通常使用认证来解决,方法很多session,token,oauth第三方框架等等. (1)常规的方法:用户登陆后生成token,返回客户端,然后服务器使用AOP拦截controller方法,校验token的有效性,每次t

mybatis学习之路(三)别名(typeAliases)mapper接口加载映射文件

一.mybatis默认支持别名 别名 映射的类型 _byte byte _long long _short short _int int _integer int _double double _float float _boolean boolean string String byte Byte long Long short Short int Integer integer Integer double Double float Float boolean Boolean date Da

存款保险制度给百姓存款再加一道安全防线

景美理财网11月30日电(记者 李春) <存款保险条例(征求意见稿)>今日面向社会公开征求意见.央行[微博]表示,存款保险制度的核心是充分保障存款人权益,这是制定政策的出发点和立足点. 存款保险是指存款银行交纳保费形成存款保险基金,当个别存款银行经营出现问题时,使用存款保险基金依照规定对存款人进行及时偿付. 作为一项金融业基础性制度安排,存款保险在国际上已发展多年,其在保护存款人权益.防范和化解金融风险方面起到重要作用.目前,世界上已有110多个国家和地区建立了存款保险制度. 我国早在1993

mybatis 详解(六)------通过mapper接口加载映射文件

通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的.那么什么是通过 mapper 接口加载映射文件呢? 我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件 以前的做法: 改进做法:使用 mapper 接口来加载映射文件 1.定义

六、通过mapper接口加载映射文件

通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的.那么什么是通过 mapper 接口加载映射文件呢? 我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这样加载吗,这样肯定是不行的,那么我们就需要使用 mapper 接口来加载映射文件 以前的做法: 改进做法:使用 mapper 接口来加载映射文件 回到顶部

Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页

1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 几个常见的用到ajax的场景. 比如你在逛知乎,你没有刷新过网页,但是你却能看到你关注的用户或者话题有了新动态的消息提示. 还比如,我们在看视频时,可以看到下面

爬虫再探实战(三)———爬取动态加载页面——selenium

自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的知识.目标——抓取页面所有的高考录取分数信息. 对于动态加载,开始的时候是看到Selenium+Phantomjs的强大,直接就学的这个.打开网页查看网页源码(注意不是检查元素)会发现要爬取的信息并不在源码里面.也就是说,从网页源码无法通过解析得到数据.Selenium+Phantomjs的强大一方

python+selenium+PhantomJS爬取网页动态加载内容

一般我们使用python的第三方库requests及框架scrapy来爬取网上的资源,但是设计javascript渲染的页面却不能抓取,此时,我们使用web自动化测试化工具Selenium+无界面浏览器PhantomJS来抓取javascript渲染的页面,下面实现一个简单的爬取 环境搭建 准备工具:python3.5,selenium,phantomjs 我的电脑里面已经装好了python3.5 安装Selenium pip3 install selenium 安装Phantomjs 按照系统

关于爬取异步加载的页面

在爬取网站时常遇到异步加载的情况,必须点击或者下拉滚动条才会加载出更多的图片或视频,在源码中却一片空白,我一开始遇到时候也有点懵,了解了就好,还是请求.学过一些前端知识的朋友都清楚其实就是ajax异步加载js,这是为了提高用户的体验,许多网站都使用这种方法. 究其根本,其实就是将这部分请求放在了后台,查看的话,按F12然后F5刷新页面,在Network标签下都会显示出来,比如下面这个网站. ? 随便点一个发现看下啥情况 ? 好吧,其实就是个get请求罢了,只是将正常的点击翻页查询变成了下拉查询,