【问题标题】:Fastapi Captcha SessionsFastapi 验证码会话
【发布时间】:2021-12-12 21:54:28
【问题描述】:

我正在使用 Fastapi 测试验证码设置。目前,我正在使用内存中的会话(存储在字典中。似乎没有问题,因为没有负载平衡等......)。

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

我的问题是这足以减轻自动化攻击(我知道您可以为服务等付费...绕过验证码,但我想看看这段代码中有哪些漏洞)?

到目前为止,这是我的代码:

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 的样子:

Session Cookie

【问题讨论】:

  • 检查代码是否存在安全漏洞并不是 Stack Overflow 的主题。但你可以在Code Review 上试试。

标签: python session captcha fastapi


【解决方案1】:

来自您的代码布局:

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 中。 嗅探器/机器人最终将能够读取您的 cookie,即使它是加密的。您正在使用加密方法 base64,可以轻松解密。

您应该实施验证码验证服务来避免这种安全漏洞,在这种安全漏洞中,用户会话中不应以任何方式存储答案的线索。验证码验证服务应该只返回truefalse

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多