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)