1、认证思路刨析过程

1、请求头去哪里拿?

1、服务器端代码:

def test(request):
print(request)
return HttpResponse('你得到我了')

2、客户端1:

import requests

key = "asdfuasodijfoausfnasdf"

response = requests.get('http://127.0.0.1:8000/api/test.html',headers={'auth_api':key})
print(response.text)

3、服务器截图1:

是因为客户端写的格式有问题更改客户端代码如下:

import requests

key = "asdfuasodijfoausfnasdf"

response = requests.get('http://127.0.0.1:8000/api/test.html',headers={'auth-api':auth_header_val})
print(response.text)

4、服务器端截图2:

5、案例:

项目需要在http header加上自定义内容, 后台使用Django。 用postman添加header后发送请求, 在request中没有发现自定义的内容,开始怀疑是postman没有成功添加自定义header内容, 于是用python requests包写请求发送, 还是没有发现,  最后去查Django发现了秘密。

Django将所有http header(包括自定义的)的内容都放到了request的META里面了, 这是个标准的python dict, 并且对自定义的内容进行了重命名, 规则如下:

(1) 所有header名大写,将连接符“-”改为下划线“_”

(2) 除CONTENT_TYPE和CONTENT_LENGTH,其它的header名称前加“HTTP_”前缀

请求头去:request.META['HTTP_AUTH_API']里面找

第一关:Django程序发送请求头

服务器端代码:

def test(request):
client_key = request.META.get('HTTP_AUTH_API')
if client_key == key:
return HttpResponse('你得到我了')
else:
return HttpResponse('休想')

客户端代码:

import requests
import time
import hashlib response = requests.get('http://127.0.0.1:8000/api/test.html',headers={'auth-api':key})
print(response.text)

黑客端代码:

import requests
import time
import hashlib response = requests.get('http://127.0.0.1:8000/api/test.html',headers={'auth-api':'asdfuasodijfoausfnasdf'})
print(response.text)

黑客截取成功:

2、此方法存在的问题:

要是被黑客截取就很危险

第二关:md5和时间,请求头中的值动态起来

服务器端代码:

def md5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8'))
return hs.hexdigest() key = "asdfuasodijfoausfnasdf" def test(request):
auth_header_val = request.META.get('HTTP_AUTH_API')
# 841770f74ef3b7867d90be37c5b4adfc|1506571253.9937866
client_md5_str, client_ctime = auth_header_val.split('|', maxsplit=1) server_md5_str = md5("%s|%s" % (key, client_ctime,))
if server_md5_str != client_md5_str:
return HttpResponse('你得到我了')
else:
return HttpResponse('休想')

客户端代码:

import requests
import time
import hashlib def md5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8'))
return hs.hexdigest() key = ""
ctime = str(time.time())
new_key = "%s|%s" %(key,ctime,) # asdfuasodijfoausfnasdf|时间戳
md5_str = md5(new_key)
# 6f800b6a11d3f9c08c77ef8f77b2d460, # asdfuasodijfoausfnasdf|时间戳
auth_header_val = "%s|%s" %(md5_str,ctime,) # 6f800b6a11d3f9c08c77ef8f77b2d460|时间戳
print(auth_header_val) response = requests.get('http://127.0.0.1:8000/api/test.html',headers={'auth-api':auth_header_val})
print(response.text)

黑客代码

import requests
import time
import hashlib response = requests.get\
('http://127.0.0.1:8000/api/test.html',headers={'auth-api':'a1c3038f9576429b584ad146d6c4e4e1|1531981662.0696678'})
print(response.text)

正常客户端截图:

黑客端截取成功:

此方法存在的问题:

第三关:时间 [10s]+加密规则+是否已经存在【10s】

服务器端代码:

def md5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8'))
return hs.hexdigest() key = "asdfuasodijfoausfnasdf"
# redis,Memcache
visited_keys = {
# "841770f74ef3b7867d90be37c5b4adfc":时间, 10
} def api_auth(func):
def inner(request,*args,**kwargs):
server_float_ctime = time.time()
auth_header_val = request.META.get('HTTP_AUTH_API')
# 841770f74ef3b7867d90be37c5b4adfc|1506571253.9937866
client_md5_str, client_ctime = auth_header_val.split('|', maxsplit=1)
client_float_ctime = float(client_ctime) # 第一关
if (client_float_ctime + 20) < server_float_ctime:
return HttpResponse('时间太久了,再去买一个吧') # 第二关:
server_md5_str = md5("%s|%s" % (key, client_ctime,))
if server_md5_str != client_md5_str:
return HttpResponse('休想') # 第三关:
if visited_keys.get(client_md5_str):
return HttpResponse('你放弃吧,来晚了') visited_keys[client_md5_str] = client_float_ctime
return func(request,*args,**kwargs) return inner @api_auth
def test(request):
return HttpResponse('正常用户')

客户端代码:

import requests
import time
import hashlib def md5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8'))
return hs.hexdigest() key = "asdfuasodijfoausfnasdf"
ctime = str(time.time())
new_key = "%s|%s" %(key,ctime,) # asdfuasodijfoausfnasdf|时间戳
md5_str = md5(new_key)
# 6f800b6a11d3f9c08c77ef8f77b2d460, # asdfuasodijfoausfnasdf|时间戳
auth_header_val = "%s|%s" %(md5_str,ctime,) # 6f800b6a11d3f9c08c77ef8f77b2d460|时间戳
print(auth_header_val)

黑客端代码:

import requests
import time
import hashlib response = requests.get('http://127.0.0.1:8000/api/test.html',
headers={'auth-api':"0d89c03e8237263a2e24ecc3e82e2bf|1531983245.4202634"})
print(response.text)

正常客户端截图:

黑客端截图:第三关超时

黑客端截图:第一关超时

解决方案:
1. 时间 [10s]
2. 加密规则
3. 是否已经存在【10s】

5、客户端目录结构:

1、client.py

import requests
import time
import hashlib def md5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8'))
return hs.hexdigest() key = "asdfuasodijfoausfnasdf"
ctime = str(time.time())
new_key = "%s|%s" %(key,ctime,) # asdfuasodijfoausfnasdf|时间戳
md5_str = md5(new_key)
# 6f800b6a11d3f9c08c77ef8f77b2d460, # asdfuasodijfoausfnasdf|时间戳
auth_header_val = "%s|%s" %(md5_str,ctime,) # 6f800b6a11d3f9c08c77ef8f77b2d460|时间戳
print(auth_header_val) response = requests.get('http://127.0.0.1:8000/api/test.html',headers={'auth-api':auth_header_val})
print(response.text)

2、harker.py

import requests
import time
import hashlib response = requests.get('http://127.0.0.1:8000/api/test.html',
headers={'auth-api':"387f764fc53eb316f148778ba2829b34|1506572694.6821892"})
print(response.text)

6、服务器端目录结构:

1、views.py

import json
from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
from repository import models
from .plugins import PluginManger
from django.db.models import Q
from datetime import date
import hashlib
import time # ############################################## API验证示例 ##############################################
def md5(arg):
hs = hashlib.md5()
hs.update(arg.encode('utf-8'))
return hs.hexdigest() key = "asdfuasodijfoausfnasdf"
# redis,Memcache
visited_keys = {
# "841770f74ef3b7867d90be37c5b4adfc":时间, 10
} def api_auth(func):
def inner(request,*args,**kwargs):
server_float_ctime = time.time()
auth_header_val = request.META.get('HTTP_AUTH_API')
# 841770f74ef3b7867d90be37c5b4adfc|1506571253.9937866
client_md5_str, client_ctime = auth_header_val.split('|', maxsplit=1)
client_float_ctime = float(client_ctime) # 第一关
if (client_float_ctime + 20) < server_float_ctime:
return HttpResponse('时间太久了,再去买一个吧') # 第二关:
server_md5_str = md5("%s|%s" % (key, client_ctime,))
if server_md5_str != client_md5_str:
return HttpResponse('休想') # 第三关:
if visited_keys.get(client_md5_str):
return HttpResponse('你放弃吧,来晚了') visited_keys[client_md5_str] = client_float_ctime
return func(request,*args,**kwargs) return inner @api_auth
def test(request):
return HttpResponse('正常用户') 

2、urls.py

添加:url(r'^test.html$', views.test)作为测试

from django.conf.urls import url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^server.html$', views.server),
url(r'^test.html$', views.test),
]

  

CMDB服务器管理系统【s5day90】:API验证的更多相关文章

  1. CMDB服务器管理系统【s5day87】:需求讨论-设计思路

    自动化运维平台愿景和服务器管理系统背景 服务器管理系统 管理后台示例 需求和设计 为什么开发服务器管理系统? 背景: 原来是用Excel维护服务器资产,samb服务[多个运维人员手动维护] 搭建运维自 ...

  2. CMDB服务器管理系统【s5day92】:服务器管理回顾

    一.服务器管理回顾 1.requests 发送: requests.post(url='',data=,json=) requests.get() Django接受: request.POST, co ...

  3. CMDB 数据加密 最终整合API验证+AES数据加密

    当CMDB运行在内网的时候,经过API验证的三关是没有问题的,但是如果运行在外网,有一个问题是,黑客截取后的访问速度比客户端快的时候还会造成数据泄露.为了解决这个问题,就要对数据进行加密 RSA加密 ...

  4. CMDB服务器管理系统【s5day90】:API构造可插拔式插件逻辑

    1.服务器端目录结构: 1.__init__.py from django.conf import settings from repository import models import impo ...

  5. CMDB服务器管理系统【s5day90】:获取今日未采集主机列表

    1.目录结构 1.服务器端 2.客户端 2.具体代码如下 1.数据库增加两个字段 class Server(models.Model): """ 服务器信息 " ...

  6. CMDB服务器管理系统【s5day90】:创建资产更新服务器硬盘信息

    1.创建硬件资产信息 import json from django.shortcuts import render,HttpResponse from django.views.decorators ...

  7. CMDB服务器管理系统【s5day88】:采集资产之Agent、SSH和Salt模式讲解

    在对获取资产信息时,简述有四种方案. 1.Agent  (基于shell命令实现) 原理图 Agent方式,可以将服务器上面的Agent程序作定时任务,定时将资产信息提交到指定API录入数据库 优点: ...

  8. CMDB服务器管理系统【s5day88】:采集资产-文件配置(一)

    django中间件工作原理 整体流程: 在接受一个Http请求之前的准备 启动一个支持WSGI网关协议的服务器监听端口等待外界的Http请求,比如Django自带的开发者服务器或者uWSGI服务器. ...

  9. CMDB服务器管理系统【s5day88】:采集资产-文件配置(二)

    上节疑问: 1.老师我们已经写到global_settings里了,为什么还要写到__init__.py setting 这的作用是为了:整合起两个的组合global_settings和setting ...

随机推荐

  1. c/c++ 多线程 利用条件变量实现线程安全的队列

    多线程 利用条件变量实现线程安全的队列 背景:标准STL库的队列queue是线程不安全的. 利用条件变量(Condition variable)简单实现一个线程安全的队列. 代码: #include ...

  2. 苹果ios系统无法通过RD Client连接win10服务器远程错误0x00001307

    问题描述: 1.RD Client无法远程Windows 10桌面,提示“错误 用户名或密码错误” 之前连接是没有问题的,但是更新了win10系统以后就出现问题了 [解决方法]: 最后找到了原因是因为 ...

  3. #020PAT 没整明白的题L1-009 N个数求和 (20 分)

    后面的测试点过不去,两个错误一个超时. 目前未解决   L1-009 N个数求和 (20 分)   本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和 ...

  4. Spring Security(三十三):10.3 Password Encoding

    Spring Security’s PasswordEncoder interface is used to support the use of passwords which are encode ...

  5. Linux内核入门到放弃-模块-《深入Linux内核架构》笔记

    使用模块 依赖关系 modutils标准工具集中的depmod工具可用于计算系统的各个模块之间的依赖关系.每次系统启动时或新模块安装后,通常都会运行该程序.找到的依赖关系保存在一个列表中.默认情况下, ...

  6. UI Automator 常用 API 整理

    主要类: import android.support.test.uiautomator.UiDevice; 作用:设备封装类,测试过程中获取设备信息和设备交互. import android.sup ...

  7. Elastic Stack-Elasticsearch介绍

    一.前言     前篇写了好像没有多少人去看,但是还是要继续,我猜想可能是很多人接触的这块比较少吧,Elasticsearch这块有很多要说的,开始吧. 二.数据库.Elasticsearch选择   ...

  8. myBatista批量查询和插入

    <select id="queryCompanyByDistrict" resultType="WyCompany"> SELECT * FROM ...

  9. 使用css画一个箭头

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. JAVA多线程-初体验

    一.线程和进程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 进程是所有线程的集合,每一个线程是进程中的一条执行路径. 二.为什么使用多线程,哪些场景下使用 多线程的好处是提高程序 ...