zoukankan      html  css  js  c++  java
  • Django API验证(令牌)

    1. 获取接口信息

    Client端

    import requests
    import time
    import hashlib
    
    ctime = time.time()
    
    key = 'akfljakfjaklfjaklfj22222324290482'
    new_key = "%s|%s" % (key, ctime)
    
    m = hashlib.md5()
    m.update(bytes(new_key, encoding='utf-8'))
    md5_key = m.hexdigest()
    md5_key_key = "%s|%s" % (md5_key, ctime)
    print(md5_key_key)
    response = requests.get("http://127.0.0.1:8001/api/asset.html", headers={'OpenKey':md5_key_key})
    print(response.text)

    2. 验证令牌信息

    Server端

    import hashlib
    import time
    from django.shortcuts import render,HttpResponse
    from django.conf import settings
    api_key_record = {}
    
    def asset(request):
        client_md5_time_key =request.META.get('HTTP_OPENKEY')
        client_md5_key,client_ctime = client_md5_time_key.split('|')
    
        client_ctime = float(client_ctime)
        server_time = time.time()
    
        # 第一关:时间关 10s内访问
    
        if server_time - client_ctime >10:
            return HttpResponse('[第一关] 访问时间超时!')
    
        # 第二关:规则关 防止修改时间
        temp = "%s|%s"%(settings.AUTH_KEY,client_ctime,)
        m = hashlib.md5()
        m.update(bytes(temp,encoding='utf-8'))
        server_md5_key = m.hexdigest()
        if server_md5_key != client_md5_key:
            return HttpResponse('[第二关] 规则不正确')
    
        for k in list(api_key_record.keys()):
            v = api_key_record[k]
            if server_time > v:
                del api_key_record[k]
    
        # 第三关
        if client_md5_time_key in api_key_record:
            return HttpResponse('[第三关] 令牌已使用过')
        else:
            api_key_record[client_md5_time_key] = client_ctime +10
    
        if request.method == "GET":
            return HttpResponse('GET: 获取重要数据')
        elif request.method == "POST":
            return HttpResponse('POST')

    3. 模拟请求

    正常请求:nomary GET请求

    import requests
    import time
    import hashlib
    
    ctime = time.time()
    
    key = 'akfljakfjaklfjaklfj22222324290482'
    new_key = "%s|%s" % (key, ctime)
    
    m = hashlib.md5()
    m.update(bytes(new_key, encoding='utf-8'))
    md5_key = m.hexdigest()
    md5_key_key = "%s|%s" % (md5_key, ctime)
    print(md5_key_key)
    response = requests.get("http://127.0.0.1:8001/api/asset.html", headers={'OpenKey':md5_key_key})
    print(response.text)

    正常请求结果

    f8012ba778903e8dd1185173ed33b0b8|1550306560.9089868
    GET: 获取重要数据

    骇客攻击请求

    hack请求

    import requests
    
    md5_key_key = '5e287e46a67ec778df70d27e7a5b8d6e|1550306579.3672032'
    response = requests.get("http://127.0.0.1:8001/api/asset.html", headers={'OpenKey':md5_key_key})
    print(response.text)

    hack请求结果

    [第三关] 令牌已使用过

     总结:

    第一关:时间关  客户端的时间和服务端的时间进行比较  10s内是正常访问 超过10s则为超时访问
                    if server_time - client_ctime > 10:
                        return HttpResponse('[第一关] 访问时间超时!')
    
    第二关:规则关 防止修改时间 服务端把服务期设置的key和客户端发来的时间进行md5加密 然后再和客户端发来的动态令牌进行比较是否一致
    
    第三关:过期令牌删除
        1、判断客户端的令牌是否在api记录里
        2、如果在表示已使用不再被使用
        3、如果不在将令牌作为key 客户端时间+10作为value放在api记录里
        4、这样每次在判断令牌是否在记录表中的时候,先遍历记录表进行比较
        比较当前的服务时间是否大于客户端+10s的时间key,如果大于则已过期直接删除,否则不做处理
        5、当然如果用redis的话,这部操作不用关心,redis key 5s  key后面指定时间redis会自动删除
  • 相关阅读:
    [Python] socket实现TFTP上传和下载
    [Python] socket发送UDP广播实现聊天室功能
    [C#] 建立UDP连接、发送广播
    [Python] Scrapy爬虫框架入门
    [Python] 常见的排序与搜索算法
    [Python] 数据结构--实现顺序表、链表、栈和队列
    [Python] Django框架入门5——静态文件、中间件、上传图片和分页
    [Python] Django框架入门4——深入模板
    [Python] Django框架入门3——深入视图
    [Python] Django框架入门2——深入模型
  • 原文地址:https://www.cnblogs.com/supery007/p/10388252.html
Copyright © 2011-2022 走看看