Python API简单验证

前言

因为CMDB内部的需求,需要一个API进行数据传输,用来传递需要抓取的服务端信息信息给抓取的autoclient,autoclient抓取好之后再通过API传输到服务器,保存到数据库。但是为了防止恶意的API访问,需要做一个验证。

 

设想一

可以在客户端跟服务端都规定好一串随机字符串做验证,只有当带着这串验证的请求发送过来的时候,才让其进行访问。

如果学过了爬虫,大家很容易就发现,这串随机字符串在浏览器里面是可以监听的,多观察几次总是会发现的。而且无论通过如何的方式,只要暴露在外面,都是会被察觉的。此时,就需要对其进行加密。

 

设想二

既然随机字符串在web传输中是明文状态,那我们试着将其转换成密文的,转换下思路,如果每次的请求都是随机字符串配合一串一直变动的值进行md5加密,此时,产生的验证字符串也应该变成动态密文。用什么做动态字符串来配合约定好的字符串进行md5加密呢?既然是动态的,时间戳,是最好的选择。   

此时一切看着都很完美,但是,忽略了一点,无论是不是加密的字符串,http请求的时候都是可以监听到的,所以即使加密,即使不知道怎么加密的,依旧可以直接拿着这串字符串直接进行验证访问。尴尬。。。

 

设想三

其实上面的设想二已经做到了动态,思路上只要改一点就立刻变成可行的了。在http请求的时候,即使是在相当糟糕的网络环境里,也不会需要发送非常长的时间,因此,卡住时间便可以实现。

在拿到client的时间戳是,服务器段只需要跟当前时间戳进行比对,如果时间间隔小于10秒就当作正常访问。就可以了。

上面的设计思路完美的解决了动态的问题,此时不免还有疑问,如果真的会在10s内盗取到字符串直接访问呢?

 

完善思路

基于上面的问题,可以再多加异步验证,写一个列表,访问过的字符串都放在列表里,后面的访问都跟此列表比对下,如果在此列表内,就拒绝访问。

如上的设计思路就可以解决问题。

优化

最后的设计思路肯定能解决问题,但是也存在一个问题,就是,随着时间进度的推移,访问列表一定会越来越大,始终是不友好的一点。肯定需要给字符串设计一个超时时间。

visited_list = ['28g12b12128912e2kj|127381237812391', '829312g12be120e102ej12je91|12312984123123',....]

如果以上述的方式取跟系统时间比较当然是一件很费事的工作,占用很多的IO,可以使用redis来轻松实现这个功能。

 

 

 

 CBV通过此类装饰方式实现验证

 验证代码

def api_auth_method(request):auth_key = request.META.get('HTTP_AUTH_KEY')if not auth_key:return Falsesp = auth_key.split('|')if len(sp) != 2:return Falseencrypt, timestamp = sptimestamp = float(timestamp)limit_timestamp = time.time() - ASSET_AUTH_TIMEprint(limit_timestamp, timestamp)if limit_timestamp > timestamp:return Falseha = hashlib.md5(ASSET_AUTH_KEY.encode('utf-8'))ha.update(bytes("%s|%f" % (ASSET_AUTH_KEY, timestamp), encoding='utf-8'))result = ha.hexdigest()print(result, encrypt)if encrypt != result:return Falseexist = Falsedel_keys = []for k, v in enumerate(ENCRYPT_LIST):print(k, v)m = v['time']n = v['encrypt']if m < limit_timestamp:del_keys.append(k)continueif n == encrypt:exist = Truefor k in del_keys:del ENCRYPT_LIST[k]if exist:return FalseENCRYPT_LIST.append({'encrypt': encrypt, 'time': timestamp})return Truedef api_auth(func):def inner(request, *args, **kwargs):if not api_auth_method(request):return JsonResponse({'code': 1001, 'message': 'API授权失败'}, json_dumps_params={'ensure_ascii': False})return func(request, *args, **kwargs)return inner
auth

 

转载于:https://www.cnblogs.com/wuzdandz/p/9429784.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完全CSS实现鼠标移上出现层的效果(超简单)

看过许多鼠标事件&#xff0c;都很复杂&#xff0c;太多的文件和繁杂的代码,而且好多都是用js实现&#xff0c;加载速度很慢。 这几天一直在找一种简单的实现效果&#xff0c;完全 CSS编写的效果&#xff0c;现在找到了&#xff0c;非常的少。 这就是完全 CSS实现的层效果&am…

搜索引擎学习日志

了解是什么&#xff1a;Google的咖啡因系统、Megastore云存储系统、Pregel云图计算模型、暗网爬取技术、Web2.0网页作弊、机器学习排序、情景搜索、社会化搜索 学习思想&#xff1a;先全局、再细节 《这就是搜索引擎&#xff1a;核心技术详解》page 33 / 315 开始第二章&#x…

前端微信签名验证工具_微信小程序API 用户数据的签名验证和加解密

用户数据的签名验证和加解密数据签名校验为了确保 开放接口 返回用户数据的安全性&#xff0c;微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验&#xff0c;确保数据的完整性。签名校验算法涉及用户的session_key&#xff0c;通过 wx.login 登录流程获取…

会计电算化的过程 实质上是用计算机,会计电算化的过程,实质上是用计算机()的过程。A.单一地替代手工会计操作B.单一地替代对会计进行分...

会计电算化的过程&#xff0c;实质上是用计算机()的过程。A&#xff0e;单一地替代手工会计操作B&#xff0e;单一地替代对会计进行分更多相关问题以下对冷饮操作要求描述错误的是&#xff1a;()客舱网路的功用。()次高速减脂过程中一般每减多少做一个平台过渡()架线施工时弧垂…

Spring MVC控制器的单元测试:配置

传统上&#xff0c;为Spring MVC控制器编写单元测试既简单又成问题。 尽管编写调用控制器方法的单元测试非常简单&#xff0c;但问题是这些单元测试不够全面。 例如&#xff0c;我们不能仅通过调用已测试的控制器方法来测试控制器映射&#xff0c;验证和异常处理。 Spring MVC…

css实现鼠标覆盖显示大图

html <div <a href”#”> <img src”img01.jpg”> <img src”img02.jpg”> </a> </div> css img{border:none;} .pic{position:relative;top:10px;left:10px} .pic a .large{position:absolute;height:0;width:0;} .pic a:hover{di…

前端js编码

1、首先是encodeURI和encodeURIComponent&#xff1b; 从名字可以清晰的看出他两都是主要用于url编码的&#xff0c;那之间有什么区别呢&#xff1f;唯一区别就是编码的字符范围&#xff0c;其中 encodeURI方法不会对下列字符编码 ASCII字母、数字、~!#$&*():/,;?&#x…

common lisp的几个基本概念

S-表达式 quote nil 与 () cons car cdr 真假 predicate 谓词与 t 与 nil null 函数 与 not 函数 if then else and 与 or defun recursion 递归 谓词 eql 与 equal format 与 read&#xff1a;format 在函数体内调用不会输出 nil&#xff08;format 函数本身有返回值为 nil) l…

python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...

3.(2019高一下浙江期末)数制转换。将一个K进制(k<10)数x转换成十进制数可采用如下方法&#xff1a;主要方法是从右向左&#xff0c;依次取数x的各位数字&#xff0c;分别计算出该数从右边数起的第i位数字与k(i-1)的积&#xff0c;再将其累加&#xff0c;直到所有的数字取完为…

计算机流体力学软件基础及工程应用,流体力学及其工程应用(英文版·原书第10版)2013年版...

流体力学及其工程应用(英文版原书第10版)出版时间&#xff1a;2013年版内容简介《流体力学及其工程应用(英文版原书第10版)/时代教育国外高校优秀教材精选》继承并发扬了前9版讲述流体力学物理现象的传统&#xff0c;并以最简单而且尽可能是最清晰&#xff0c;但又不使用复杂数…

Spring MVC测试框架入门–第2部分

这个迷你系列的第一个博客介绍了Spring MVC测试框架&#xff0c;并展示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途。 现在是时候讨论使用框架进行集成测试了。 “集成测试”是指将Spring上下文加载到测试环境中&#xff0c;以便控制器可…

jira java接口生成问题

参考页面: 可方便扩展的JIRA Rest Web API的封装调用 JIRA是一个缺陷跟踪管理系统&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域,当我们需要把第三方业务系统集成进来时&#xff0c;可以调用他的API。 JIRA本身的A…

pmd 使用笔记

pmd是一块开源的代码静态分析工具&#xff0c;使用java编写&#xff0c;可以自定义规则来进行自己想要的分析。pmd可以单独使用&#xff0c;也可以作为idea、eclipse的插件使用。它的规则分为xpath规则&#xff0c;和java规则。https://pmd.github.io/ pmd内部工作机制比较简单…

css用一张大图片来设置背景的技术真相

之前就知道了用一张图片来设置页面内的所有背景的技术。原理很简单&#xff0c;利用background-potision精确地定位到图片的位置。好处是减少页面 的http请求数。 老实说&#xff0c;我并不觉得这个技术有多值得推广。虽然是减少了http请求数&#xff0c;但对于99%的网站来说&…

flex 平铺布局_flex布局及各种布局的总结

Flexbox display: flex;如果也想设置内联元素为弹性盒子&#xff0c;可以使用display:inline-flex;实现三种其他布局难以达到的效果&#xff1a;在父内容里面垂直居中一个块内容。使容器的所有子项占用等量的可用宽度/高度&#xff0c;而不管有多少宽度/高度可用。使多列布局中…

计算机网络应用押韵句,现代汉语练习题

第一章导论一、填空题1、汉语做为一种语言&#xff0c;具有一切语言共有的性质。即从内部结构上说&#xff0c;它是一种音译结合的符号系统&#xff1b;从外部功能上说&#xff0c;它是人类社会重要的交际工具和思维工具。2、语言符号最重要的特点是任意性和线条性。3、“现代汉…

Python中 sys.argv[]的用法简明解释

Python中 sys.argv[]的用法简明解释 因为是看书自学的python,开始后不久就遇到了这个引入的模块函数&#xff0c;且一直在IDLE上编辑了后运行&#xff0c;试图从结果发现它的用途&#xff0c;然而结果一直都是没结果&#xff0c;也在网上查了许多&#xff0c;但发现这个问题的比…

在Apache Hadoop(多节点群集)中运行Map-Reduce作业

我们将在这里描述在多节点集群中的Apache Hadoop中运行MapReduce Job的过程。 要在多节点群集中设置Apache Hadoop &#xff0c;可以阅读设置Apache Hadoop多节点群集 。 为了进行设置&#xff0c;我们必须在每台计算机上使用以下配置Hadoop&#xff1a; 在所有节点的conf / …

写出完美CSS代码的5个重要方面

每个人都可以编写CSS代码&#xff0c;甚至你现在已经让它为你的项目工作了。我在博客中也一直与大家讨论&#xff0c;学习CSS编码与CSS技巧。但是CSS还 可以更好吗&#xff1f;开始用这5个Tips改进你的CSS吧&#xff01; 一、关于 CSS重置 首先&#xff0c;很认真的告诉你&…

文件上传漏洞及其绕过、对策、过狗

1. 文件包含上传&#xff1a; php://input属于php内置的封装协议&#xff0c;其实都主要是include&#xff08;&#xff09;函数处理不当如果有文件是以下写法&#xff0c;xxx随便&#xff1a;<?phpinclude($_GET[xxx]);?> 以上保存到test.php&#xff0c; 我们访问ht…