zoukankan      html  css  js  c++  java
  • API

    API

    1.在请求头中加入key

    server 给客户端发一个key 

    client (key)

    服务端在client请求中看是否有key,如果有就是正常客户端没有就是非正常客户端

     

    client.py
    import requests
    key="qwrwertyuiop"
    
    response = requests.get("http://127.0.0.1:8000/api/test.html",header={'auth-api':key})
    print(response.text)
    
    server.py
    from django.http import HttpResponse
    
    key="qwrwertyuiop"
    def test(request):
        client_key=request.META.get("HTTP_AUTH_API")
        if client_key == key:
            return HttpResponse("you get me")
        else:
            return HttpResponse("no")
    

    2. md5和时间,请求头中的值动态起来

    客户端给服务器发过去,服务端动态的解出来

    思路--》时间是动态的,但是key不是动态的 两个需要配合起来,但不能拼接其他,如果简单拼接key就泄漏了---》把key和time md5

    client.py
    
    import requests
    key="qwrwertyuiop"
    import hashlib
    import time
    
    
    
    
    def md5(arg):
        hs=hashlib.md5() #由于在python3中在update用的是字节类型所以需要把字符串变成字节
        hs.update(arg.encode("utf8"))
        return hs.hexdigest()
    
    ctime = str(time.time())
    new_key = "%s|%s" %(key,ctime,)
    md5_str=md5(new_key)
    #只发随机字符串服务端无法解 ,所以需要把时间发给服务端,试服务端即有key也有时间,服务端也同样加密,加密后的值和客户端一致说明正常用户
    api_header_val="%s|%s" %(md5_str,ctime,)
    # response = requests.get("http://127.0.0.1:8000/api/test.html",header={'auth-api':md5_str})
    response = requests.get("http://127.0.0.1:8000/api/test.html",header={'auth-api':api_header_val})
    print(response.text)
    
    server.py
    
    import hashlib
    
    from django.http import HttpResponse
    
    key="qwrwertyuiop"
    
    def md5(arg):
        hs=hashlib.md5() #由于在python3中在update用的是字节类型所以需要把字符串变成字节
        hs.update(arg.encode("utf8"))
        return hs.hexdigest()
    
    def test(request):
        auth_header_val=request.META.get("HTTP_AUTH_API")
        client_md5_str,client_ctime=auth_header_val.split("|",maxsplit=1)
        server_md5_str = md5("%s|%s" %(key,client_ctime,))
        if client_md5_str == server_md5_str:
            return HttpResponse("you get me")
        else:
            return HttpResponse("no")
    

      

    3. (2)会产生大量可用的key--》时间限制

    server.py
    import hashlib
    
    import time
    from django.http import HttpResponse
    
    key="qwrwertyuiop"
    
    def md5(arg):
        hs=hashlib.md5() #由于在python3中在update用的是字节类型所以需要把字符串变成字节
        hs.update(arg.encode("utf8"))
        return hs.hexdigest()
    
    def test(request):
        server_float_ctime = time.time()
        auth_header_val=request.META.get("HTTP_AUTH_API")
        client_md5_str,client_ctime=auth_header_val.split("|",maxsplit=1)
        client_float_ctime=float(client_ctime)
        if (client_float_ctime+10) < server_float_ctime:
            return HttpResponse("时间太久了")
        server_md5_str = md5("%s|%s" %(key,client_ctime,))
        if client_md5_str == server_md5_str:
            return HttpResponse("you get me")
        else:
            return HttpResponse("no")
    
    client.py
    import requests
    key="qwrwertyuiop"
    import hashlib
    import time
    
    
    
    
    def md5(arg):
        hs=hashlib.md5() #由于在python3中在update用的是字节类型所以需要把字符串变成字节
        hs.update(arg.encode("utf8"))
        return hs.hexdigest()
    
    ctime = str(time.time())
    new_key = "%s|%s" %(key,ctime,)
    md5_str=md5(new_key)
    #只发随机字符串服务端无法解 ,所以需要把时间发给服务端,试服务端即有key也有时间,服务端也同样加密,加密后的值和客户端一致说明正常用户
    api_header_val="%s|%s" %(md5_str,ctime,)
    # response = requests.get("http://127.0.0.1:8000/api/test.html",header={'auth-api':md5_str})
    response = requests.get("http://127.0.0.1:8000/api/test.html",header={'auth-api':api_header_val})
    print(response.text)
    

      

    3.添加加密规则限制【字符串不能被修改】,访问过的key和时间添加到字典中,不允许在访问

    server.py
    import hashlib
    
    import time
    from django.http import HttpResponse
    
    key="qwrwertyuiop"
    visited_key={
        #'sf':time
    }
    
    def md5(arg):
        hs=hashlib.md5() #由于在python3中在update用的是字节类型所以需要把字符串变成字节
        hs.update(arg.encode("utf8"))
        return hs.hexdigest()
    
    def test(request):
        server_float_ctime = time.time()
        auth_header_val=request.META.get("HTTP_AUTH_API")
        client_md5_str,client_ctime=auth_header_val.split("|",maxsplit=1)
        client_float_ctime=float(client_ctime)
        #第一关时间
        if (client_float_ctime+10) < server_float_ctime:
            return HttpResponse("时间太久了")
        # 第二关加密
        server_md5_str = md5("%s|%s" %(key,client_ctime,))
    
        if client_md5_str != server_md5_str:
            return HttpResponse("休想")
    
        #第三关
        if visited_key.get(client_md5_str):
            return HttpResponse("you are late")
    
        visited_key[client_md5_str]=client_float_ctime
        return  HttpResponse("正常用户")
    

      

    client.py
    import requests
    key="qwrwertyuiop"
    import hashlib
    import time
    
    
    
    
    def md5(arg):
        hs=hashlib.md5() #由于在python3中在update用的是字节类型所以需要把字符串变成字节
        hs.update(arg.encode("utf8"))
        return hs.hexdigest()
    
    ctime = str(time.time())
    new_key = "%s|%s" %(key,ctime,)
    md5_str=md5(new_key)
    #只发随机字符串服务端无法解 ,所以需要把时间发给服务端,试服务端即有key也有时间,服务端也同样加密,加密后的值和客户端一致说明正常用户
    api_header_val="%s|%s" %(md5_str,ctime,)
    # response = requests.get("http://127.0.0.1:8000/api/test.html",header={'auth-api':md5_str})
    response = requests.get("http://127.0.0.1:8000/api/test.html",header={'auth-api':api_header_val})
    print(response.text)
    

      

      

      

      

      

      

  • 相关阅读:
    在网络中传输数据(I)
    WinForm DataGrid 中在 DataGridBoolColumn 的列标题上加一个 CheckBox 实现全选和全不选
    datagrid 相关
    Agile Framework视频演示发布
    asp.net(含:模拟登陆,照片列表)
    会计电算化常考题目一
    jquery实例教学一
    ASP .net(照片列表详细功能CRUD演示)
    会计电算化常考题目
    ASP.NET(get和post比较)
  • 原文地址:https://www.cnblogs.com/morgana/p/7618306.html
Copyright © 2011-2022 走看看