Fastapi Captcha Sessions



我正在使用Fastapi测试captcha设置。目前,我正在使用内存会话(存储在字典中)。似乎不是一个问题,因为没有负载平衡,等等…)。

要填写联系人表单,前端应用程序请求启动会话(从而检索验证码图像并设置一个不透明的(实际上只是一个随机的UUID)会话cookie(过期)。当然,id引用包含captcha答案的内存会话,该会话在提交时进行检查。如果验证码答案与会话的验证码不匹配,则清除会话的验证码,并在用户的会话中设置新的验证码。

我的问题是,这是否足以减轻自动化攻击(我知道你可以支付服务等…绕过验证码,但我正试图看看这个代码中有什么漏洞)?

下面是目前为止的代码:
from captcha.image import ImageCaptcha
from fastapi import FastAPI, Request, Response, HTTPException, status
def captcha_generator(size: int):
return ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(size))

def generate_captcha():
captcha: str = captcha_generator(5)
image = ImageCaptcha()
data = image.generate(captcha)
data = base64.b64encode(data.getvalue())
return {"data": data, "captcha": captcha}
@app.get('/')
def main(request: Request):
return templates.TemplateResponse("index.html", {"request": request})
@app.get('/start-session')
def start_session(request: Request):
captcha = generate_captcha()
request.session["captcha"] = captcha['captcha']
captcha_image = captcha["data"].decode("utf-8")
return StreamingResponse(io.BytesIO(base64.b64decode(captcha_image)), media_type="image/png")
@app.post('/contact-submission')
def submission(
request: Request
,response: Response
,data # This includes the captcha answer provided by user
):
if request.session.get("captcha", uuid.uuid4()) == data.captcha:
return status.HTTP_200_OK
else:
request.session["captcha"] = str(uuid.uuid4())
raise HTTPException(status.HTTP_403_FORBIDDEN, detail="Captcha Does not Match")

这是cookie的样子:

会话Cookie

从你的代码布局:

def generate_captcha():
captcha: str = captcha_generator(5)
image = ImageCaptcha()
data = image.generate(captcha)
data = base64.b64encode(data.getvalue())
return {"data": data, "captcha": captcha}

if request.session.get("captcha", uuid.uuid4()) == data.captcha:
return status.HTTP_200_OK

您将在cookie中存储验证码的线索。Sniffer/bot最终将能够读取您的cookie,即使它是加密的。您使用的加密方法是base64,可以很容易地解密。

你应该实现一个captcha验证服务来避免这种安全漏洞,在这种漏洞中,应该没有答案的线索以任何方式存储在用户会话中。captcha验证服务应该只返回truefalse

相关内容

  • 没有找到相关文章

最新更新