CMDB之API验证

在CMDB项目中,数据通过requests模块POST到API以及中控机通过requests模块的GET请求拿取未采集信息的服务器列表,对于这种请求,毋庸置疑是需要验证的,来防止非法请求

那么如何验证,最容易想到的自然是token

版本一:

服务端存一个固定的token值,客户端在发送请求的时候携带这个token

# 这种方式虽然实现了一定程度的验证,但是显然不可能这么去做

版本二:

采取动态token的方式:

token的结构:加密过的信息|时间戳

原理:将时间戳及settings里的token值进行加密计算与发过来的yoken值比较

代码实现

服务端

TOKEN = "hello world"
settings.py里
def check_token(token):
    val, time = token.split("|")
    m = hashlib.md5()
    s = "%s|%s" % (settings.TOKEN, time)
    m.update(bytes(s,encoding="utf-8"))
    token = m.hexdigest()
    return True if val == token else False
写一个验证token的方法

客户端

def get_token():
    m = hashlib.md5()
    now_time = time.time()
    setting_token = settings.TOKEN
    ls = "%s|%s"%(setting_token, now_time)
    m.update(bytes(ls,encoding="utf-8"))
    token = "%s|%s"%(m.hexdigest(), now_time)
    return token
写一个得到token的方法

 # 这种方式仍然存在缺点,即使是N多年前的token,现在也能够使用

版本三:

容易想到,加个过期时间,在验证token值的之前,对时间戳进行判断,如果超过一定时间就直接return

# 这种方式的问题是,在过期之前,黑客拿到了token后仍然能够使用,

版本四:

保存使用信息,如果该token使用过就不让再次使用

需要维护一个列表,用于记录使用过的token,为了防止列表过大,可以删除过时的key

也可以使用redis,其自带过期时间设置

# 存在的问题:有没有可能在用户使用之前,黑客拿到token并使用

 版本五:

使用AEX加密

posted @ 2019-01-10 18:46  风中琉璃  阅读(226)  评论(0)    收藏  举报