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. LeetCode算法题-Baseball Game(Java实现)

    这是悦乐书的第288次更新,第305篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是682).你现在是棒球比赛点记录器.给定一个字符串列表,每个字符串 ...

  2. LeetCode算法题-Average of Levels in Binary Tree(Java实现)

    这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...

  3. 【实战代码】PHP实现读取一个1G的文件大小

    本文地址:http://www.cnblogs.com/aiweixiao/p/7535351.html 欢迎关注我的微信公众号哈 “ 程序员的文娱情怀” http://t.cn/RotyZtu [背 ...

  4. linux ssh免密登陆远程服务器

    10.170.1.18服务器免密登录到10.170.1.16服务器 首先登入一台linux服务器(10.170.1.18),此台做为母机(即登入其他linux系统用这台做为入口):执行一行命令生成ke ...

  5. kernel笔记——内核同步与锁

    内核同步 内核同步解决并发带来的问题,多个线程对同一数据进行修改,数据会出现不一致的情况,同步用于保护共享数据等资源. 有两种形式的并发: 同时进行式并发,在不同cpu上执行的进程同时访问共享数据 二 ...

  6. UVALive - 3523 - Knights of the Round Table

    Problem  UVALive - 3523 - Knights of the Round Table Time Limit: 4500 mSec Problem Description Input ...

  7. Kubernetes的本质

    在前面的四篇文章中,我以 Docker 项目为例,一步步剖析了 Linux 容器的具体实现方式.通过这 些讲解你应该能够明白:一个“容器”,实际上是一个由 Linux Namespace.Linux ...

  8. 解决刷新页面vuex store中数据丢失的问题

    **问题背景:**页面刷新后,vuex中的数据丢失.这是因为:js代码是运行在内存中的,代码运行时的所有变量.函数也都是保存在内存中的.进行刷新页面的操作,以前申请的内存被释放,重新加载脚本代码,变量 ...

  9. 【ubuntu】Ubuntu 修改 Apache2 运行用户/用户组及修改方法

    我们在安装apache后,有时在上传文件的时候,提示没有权限或者是不可写,我们都会去查文件夹的权限.通过ls -l /var/www/html/website可以很直观的看出我们文件和文件夹的权限,d ...

  10. ckeditor,关于数据回显