API验证插件
前言
如果在访问某WebAPI过程中request信息被他人截获,若是get请求获取数据还好,如果是post提交数据,势必威胁数据安全,所以对于一个对安全性要求较高的API来说,对每个请求做身份验证显得尤为重要;
防范策略解析
策略1
客户端发送http请求访问API时,在请求头里设置一个双方约定好的key;
知识点:
1、如果给Django程序发送请求头,headers携带内容包含下滑杠 _,Django会不认识;
2、客户端 auth-api ----->服务端 转换成 'HTTP_AUTH_API'格式
3、服务端获取clent_key=request.META.get('HTTP_AUTH_API')
客户端
import requests
key='sssdkjrjefjewfakfhkj'
respose=requests.get(url='http://127.0.0.1:8000/test.html/',headers={'auth-api':key}).text
#如果给Django程序发送请求头,如果headers里面的内容使用下滑杠 _,Django会不认识;
#auth-api -----> 转换成 'HTTP_AUTH_API'格式
#服务端获取clent_key=request.META.get('HTTP_AUTH_API')
print(respose)
服务端
def test(request):
key='sssdkjrjefjewfakfhkj'
clent_key=request.META.get('HTTP_AUTH_API')
if clent_key == key:
return HttpResponse('你得到我了')
else:
return HttpResponse('休想')
漏洞:虽然双方约定好了key,但是请求头依然会被截获到;
策略2
1.key+当前客户端时间戳 组成1个MD5加密字符串
2.MD5加密字符串|当前时间戳 组成1串密码,hearder携带
3.服务端接收到客户端发送的那1串密码,split 出客户端时间
4.来着客户端时间+服务端key做MD5加密还原,对比客户端和服务端
客户端
import requests
import time
import hashlib
key='sssdkjrjefjewfakfhkj'
ctime=str(time.time())
def MD5(arg):
hs=hashlib.md5()
hs.update(arg.encode('utf-8')) #python3加密使用字节类型
return hs.hexdigest() new_key='%s|%s' % (key,ctime) # sssdkjrjefjewfakfhkj | 时间戳
md5_str=MD5(new_key)
auth_api_val='%s|%s'%(md5_str,ctime) #d0e0ca7d1f8f72d60715696d4baac3b2(key和时间戳加密后的结果)| 时间戳
print(md5_str)
respose=requests.get(url='http://127.0.0.1:8000/test.html/',headers={'auth-api':auth_api_val}).text
print(respose)
服务端
import hashlib
import time def MD5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8')) # python3加密使用字节类型
return hs.hexdigest() def test(request):
key='sssdkjrjefjewfakfhkj'
auth_api_val=request.META.get('HTTP_AUTH_API') #052dd27c130f4b9b5a8a4ec4b243962d | 1507374976.4620001
client_md5_str,client_ctime =auth_api_val.split('|',maxsplit=1)
server_md5_str=MD5('%s|%s'%(key,client_ctime)) if client_md5_str== server_md5_str:
return HttpResponse('你得到我了')
else:
return HttpResponse('休想')
漏洞:折腾了半天虽然可以动态加密,但依然可以获取到,且客户端会生成很多加密字符串,黑客获取任意一个都可以访问到API
策略3
1.key+当前客户端时间戳 组成1个MD5加密字符串
2.MD5加密字符串|当前时间戳 组成1串密码,hearder携带
3.服务端接收到客户端发送的那1串密码,split 出客户端时间
4.来着客户端时间+服务端key做MD5加密还原,对比客户端和服务端是否相等
5.动态密码有时间限制,超过5秒失效
客户端
import requests
import time
import hashlib
key='sssdkjrjefjewfakfhkj'
ctime=str(time.time())
def MD5(arg):
hs=hashlib.md5()
hs.update(arg.encode('utf-8')) #python3加密使用字节类型
return hs.hexdigest() new_key='%s|%s' % (key,ctime) # sssdkjrjefjewfakfhkj | 时间戳
md5_str=MD5(new_key)
auth_api_val='%s|%s'%(md5_str,ctime) #d0e0ca7d1f8f72d60715696d4baac3b2(key和时间戳加密后的结果)| 时间戳
print(md5_str)
respose=requests.get(url='http://127.0.0.1:8000/test.html/',headers={'auth-api':auth_api_val}).text
print(respose)
服务端
def test(request):
server_float_ctime=time.time()
key='sssdkjrjefjewfakfhkj'
auth_api_val=request.META.get('HTTP_AUTH_API') #052dd27c130f4b9b5a8a4ec4b243962d | 1507374976.4620001
client_md5_str,client_ctime =auth_api_val.split('|',maxsplit=1)
client_float_ctime=float(client_ctime) if client_float_ctime+5 < server_float_ctime:
return HttpResponse('想要破解密码最在5秒之内') server_md5_str = MD5('%s|%s' % (key, client_ctime))
if client_md5_str== server_md5_str:
return HttpResponse('你得到我了')
else:
return HttpResponse('休想')
漏洞:虽然加密字符串有了时间限制,但时间就是漏洞
策略4
1.key+当前客户端时间戳 组成1个MD5加密字符串
2.MD5加密字符串|当前时间戳 组成1串密码,hearder携带
3.服务端接收到客户端发送的那1串密码,split 出客户端时间
4.来着客户端时间+服务端key做MD5加密还原,对比客户端和服务端是否相等
5.动态+加密字符串+时间限制,超过5秒失效
6.记录最近5秒访问客户端的加密字符串,如果当前客户端使用的字符串存在记录中,说明是窃取(因为正常用户每次,访问API会携带不同的加密字符串)
客户端
import requests
import time
import hashlib
key='sssdkjrjefjewfakfhkj'
ctime=str(time.time())
def MD5(arg):
hs=hashlib.md5()
hs.update(arg.encode('utf-8')) #python3加密使用字节类型
return hs.hexdigest() new_key='%s|%s' % (key,ctime) # sssdkjrjefjewfakfhkj | 时间戳
md5_str=MD5(new_key)
auth_api_val='%s|%s'%(md5_str,ctime) #d0e0ca7d1f8f72d60715696d4baac3b2(key和时间戳加密后的结果)| 时间戳
print(md5_str)
respose=requests.get(url='http://127.0.0.1:8000/test.html/',headers={'auth-api':auth_api_val}).text
print(respose) #如果给Django程序发送请求头,如果headers里面的内容使用下滑杠 _,Django会不认识;
#auth-api -----> 转换成 'HTTP_AUTH_API'格式
#服务端获取clent_key=request.META.get('HTTP_AUTH_API')
服务端
#api验证装饰器
def api_auth(func):
def inner(request,*args,**kwargs):
server_float_ctime = time.time()
key = 'sssdkjrjefjewfakfhkj'
auth_api_val = request.META.get('HTTP_AUTH_API') # 052dd27c130f4b9b5a8a4ec4b243962d | 1507374976.4620001
client_md5_str, client_ctime = auth_api_val.split('|', maxsplit=1)
client_float_ctime = float(client_ctime)
# 第1关时间限制
if client_float_ctime + 5 < server_float_ctime:
return HttpResponse('想要破解密码最在5秒之内')
# 第二关 MD5加密
server_md5_str = MD5('%s|%s' % (key, client_ctime))
if client_md5_str != server_md5_str:
return HttpResponse('休想')
# 第三关
for k in list(visited_keys.keys()): #清空字典访问记录
v=visited_keys[k]
if server_float_ctime > v:
del visited_keys[k]
#已经使用过 MD5加密字符串(访问记录)
if visited_keys.get(client_md5_str):
return HttpResponse('你放弃吧')
visited_keys[client_md5_str] = client_float_ctime+5#(只需维护5秒之内访问记录即可,因为超过5秒第一关都过不去了)
return func(request,*args,**kwargs)
return inner
漏洞:待各位看官补充。。。。
参考:http://www.cnblogs.com/wupeiqi/articles/6746744.html
API验证插件的更多相关文章
- jQuery Validate 表单验证插件----Validate简介,官方文档,官方下载地址
一. jQuery Validate 插件的介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆 ...
- Jquery.validate.js表单验证插件的使用
作为一个网站web开发人员,以前居然不知道还有表单验证这样好呀的插件,还在一行行写表单验证,真是后悔没能早点知道他们的存在. 最近公司不忙,自己学习一些东西的时候,发现了validation的一个实例 ...
- jQuery formValidator表单验证插件
什么是jQuery formValidator? jQuery formValidator表单验证插件是客户端表单验证插件. 在做B/S开发的时候,我们经常涉及到很多表单验证,例如新用户注册,填写个人 ...
- bootstrapValidator表单验证插件
bootstrapValidator——一个很好用的表单验证插件,再也不用手写验证规则啦! bootstrapValidator官方文档:http://bootstrapvalidator.votin ...
- jquery validate强大的jquery表单验证插件
jquery validate的官方演示和文档地址: 官方网站:http://jqueryvalidation.org/ 官方演示:http://jqueryvalidation.org/files/ ...
- 10个强大的Javascript表单验证插件推荐
创建一个JavaScript表单验证插件,可以说是一个繁琐的过程,涉及到初期设计.开发与测试等等环节.实际上一个优秀的程序员不仅是技术高手,也应该是善假于外物的.本文介绍了10个不错的JavaScri ...
- CMDB 数据加密 最终整合API验证+AES数据加密
当CMDB运行在内网的时候,经过API验证的三关是没有问题的,但是如果运行在外网,有一个问题是,黑客截取后的访问速度比客户端快的时候还会造成数据泄露.为了解决这个问题,就要对数据进行加密 RSA加密 ...
- VeeValidate——vue2.0表单验证插件
一.vee-validate入门 vee-validate 是一个轻量级的 vue表单验证插件.它有很多开箱即用的验证规则,也支持自定义验证规则.它是基于模板的,因此它与HTML5验证API类似且熟悉 ...
- jquery validate表单验证插件-推荐
1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家. 1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮 ...
随机推荐
- Codeforces Round #117 (Div. 2) D.Common Divisors(KMP最小循环节)
http://codeforces.com/problemset/problem/182/D 题意:如果把字符串a重复m次可以得到字符串b,那么我们称字符串a为字符串b的一个因子,现在给定两个字符串S ...
- 前端面试题 | JS部分(附带答案)
目前在找工作,所以各方收集了一堆面试题.其实刷面试题的过程也能更新自己对知识的认识,所以也提醒自己多看多理解.如果对下面题目有更深理解,会实时更新.遇到新题目,也会不定时更新.希望能帮助到部分朋友- ...
- 在GeoServer里设置图层的默认自定义样式,出现不显示预览图的情况(不起作用)
在GeoServer里设置图层的默认自定义样式 点击"Layers-->world:country"图层,点击"Publishing"标签,在下面的&qu ...
- 八皇后问题 递归实现 C语言 超详细 思路 基础
八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...
- centos7 彻底卸载PHP7
[root@xxx php-memcached]# rpm -qa | grep php php70w-common--.w7.x86_64 php70w-devel--.w7.x86_64 php7 ...
- 力扣(LeetCode)70. 爬楼梯
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...
- 学习笔记46—如何使Word和EndNote关联
1)打开Word文件项目中的选项,然后点击加载项, 2)找到Endnote安装目录,选择目录中的Configure EndNote.exe,选中configuration endnote compon ...
- SpringMVC 处理Date类型数据@InitBinder @DateTimeFormat 注解 的使用
使用SpringMVC的时候,需要将表单中的日期字符串转换成对应JavaBean的Date类型,而SpringMVC默认不支持这个格式的转换,解决方法有两种,如下: 方法一 . 在需要日期转换的Con ...
- Asp.net core 学习笔记 ( IIS, static file 性能优化 )
更新 : 2019-02-06 最后还是把 rewrite 给替换掉了. 所以 rewrite url 也不依赖 iis 了咯. refer : https://docs.microsoft.com/ ...
- 日常英语---九、冒险岛link技能导读
日常英语---九.冒险岛link技能导读 一.总结 一句话总结:选最值得练的link技能列上来,先熟悉一部分,没必要一开始就全部弄懂,这样压力太大,可以先熟悉比较有意义的一部分啊 学以致用-还不如说成 ...