首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fastapi Captcha会议

Fastapi Captcha会议
EN

Stack Overflow用户
提问于 2021-10-27 15:31:44
回答 1查看 929关注 0票数 1

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

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

我的问题是,这足以减轻自动化攻击(我知道你可以支付服务等.为了绕开captcha,但我想看看这段代码中有哪些循环漏洞)?

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

代码语言:javascript
复制
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的外观:

会话琦琦

EN

回答 1

Stack Overflow用户

发布于 2022-02-10 01:19:23

从您的代码布局:

代码语言:javascript
复制
def generate_captcha():
    captcha: str = captcha_generator(5)
    image = ImageCaptcha()
    data = image.generate(captcha)
    data = base64.b64encode(data.getvalue())
    return {"data": data, "captcha": captcha}

代码语言:javascript
复制
if request.session.get("captcha", uuid.uuid4()) == data.captcha:
       return status.HTTP_200_OK

你把卡普查的线索储存在饼干里。Sniffer/bot最终将能够读取您的cookie,即使它是加密的。您正在使用的加密方法base64,可以很容易地解密。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69741502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档