python代码主要有两个安全问题:
1. 没有做数据校验, 不能确保接收到的数据是从小爱平台发过来的. 直接暴露家庭控制接口在公网上还是有点危险. 小爱平台是有数据校验的方式的.
2. 一个小问题,可以忽略 Flask自带那个服务器只是简单的测试服务器, 不建议直接开放到外网.
对于第一个问题:
xiaomi_secret = base64.b64decode("xxxx你的小米secret")
xiaomi_key_id = "xxxxx你的小米keyid"
xiaomi_host = "xxxx你的域名"
# 小爱请求校验
def check_for_sign():
method = request.method
path = request.path
date = request.headers.get('X-Xiaomi-Date')
content_type = request.headers.get('Content-Type')
content_md5 = request.headers.get('Content-Md5')
signdata = method + "\n" + path + "\n" + "\n" + date + "\n" + xiaomi_host + "\n" + content_type + "\n" + content_md5 + "\n"
authorization = request.headers.get('Authorization')
keyid = authorization.split(":")[0].split()[1]
check_authorization = authorization.split(':')[2]
countted_authorization = hmac.new(
xiaomi_secret, msg=signdata.encode("utf-8"), digestmod=hashlib.sha256).hexdigest().lower()
if keyid != xiaomi_key_id or check_authorization != countted_authorization:
app.logger.error('sign check fail!')
return False
else:
app.logger.warn('sign check pass!')
return True
#然后在index方法下面调用check_for_sign这个你发进行请求校验
if not check_for_sign():
return Flask.make_response("<html>ERROR!</html>", 403)
对于第二个问题:
网上资料很多, 一般使用waitress + nginx配置就行 |