赞
踩
FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。
在数据验证和转换方面,高级用法提供了更精细和准确的控制,确保输入数据的质量和安全性。它还能更高效地处理异步操作,提升应用程序的性能和响应速度,特别是在处理大量并发请求时优势明显。
此外,高级用法还有助于更好地整合数据库操作、实现数据的持久化和查询优化,以及实现更严格的认证和授权机制,保护应用程序的敏感数据和功能。总之,掌握 FastAPI 的高级用法可以帮助开发人员构建出功能更强大、性能更卓越、安全可靠的 Web 应用程序。
本篇学习FastAPI的身份验证机制,通过接收包含用户名和密码信息,以验证用户的身份。
是一种简单有效的身份验证机制,允许服务器验证客户端的身份,并在HTTPS加密通道下提供基本的传输安全性,实现了跨平台的统一认证方式,尽管它存在一定的安全隐患,但依然是Web应用程序常用的认证方式之一。
使用HTTP Basic Authentication的作用包括:
是一种利用目标系统或算法在处理不同输入时所需的时间差异来获取敏感信息的攻击方式。其主要原理如下:
时序差异:某些系统或算法在处理不同输入时可能需要的时间不同,这可能会泄露一些敏感信息。例如,验证密码时对比正确密码和错误密码的耗时差异。
信息泄露:这种时间差异可能泄露出一些有价值的信息,如部分正确的密码字符、加密密钥的位数等。攻击者可以利用这些信息逐步推断出完整的敏感信息。
攻击过程:攻击者会反复尝试不同的输入,并精确测量处理每个输入所需的时间,从中寻找有价值的时间差异模式。通过统计分析和机器学习等技术,攻击者可以从这些微小的时间差异中提取有用的信息。
- conda create -n fastapi_test python=3.10
- conda activate fastapi_test
- pip install fastapi uvicorn
- # -*- coding: utf-8 -*-
- from typing import Annotated
- import secrets
- import uvicorn
- from fastapi import FastAPI, Depends, HTTPException,status
- from fastapi.security import HTTPBasic, HTTPBasicCredentials
-
- app = FastAPI()
-
- security = HTTPBasic()
-
- DEFAULT_USERNAME = b"zhangsan"
- DEFAULT_PASSWORD = b"123456"
-
- def check(
- credentials: Annotated[HTTPBasicCredentials, Depends(security)],
- ):
- if not (credentials.username.encode("utf8") == DEFAULT_USERNAME) or not (credentials.password.encode("utf8") == DEFAULT_PASSWORD):
- raise HTTPException(
- status_code=status.HTTP_401_UNAUTHORIZED,
- detail="用户名或密码错误",
- headers={"WWW-Authenticate": "Basic"},
- )
-
- return credentials
-
- @app.get("/login")
- def login(credentials: Annotated[HTTPBasicCredentials, Depends(check)]):
- print(f'username: {credentials.username}, password: {credentials.password}')
- return '登录成功'
-
- if __name__ == '__main__':
- uvicorn.run(app, host='0.0.0.0', port=7777)
调用结果:
输入正确账号:
输入错误账号:
使用secrets.compare_digest防范Timing Attacks,secrets.compare_digest()在比较不同字符串时花费的时间相同,从而使应用程序免受定时攻击的影响。
- # -*- coding: utf-8 -*-
- from typing import Annotated
- import secrets
- import uvicorn
- from fastapi import FastAPI, Depends, HTTPException,status
- from fastapi.security import HTTPBasic, HTTPBasicCredentials
-
- app = FastAPI()
-
- security = HTTPBasic()
-
- DEFAULT_USERNAME = b"zhangsan"
- DEFAULT_PASSWORD = b"123456"
-
- def check(
- credentials: Annotated[HTTPBasicCredentials, Depends(security)],
- ):
- current_username_bytes = credentials.username.encode("utf8")
- is_correct_username = secrets.compare_digest(
- current_username_bytes, DEFAULT_USERNAME
- )
- current_password_bytes = credentials.password.encode("utf8")
- is_correct_password = secrets.compare_digest(
- current_password_bytes, DEFAULT_PASSWORD
- )
-
- if not (is_correct_username and is_correct_password):
- raise HTTPException(
- status_code=status.HTTP_401_UNAUTHORIZED,
- detail="用户名或密码错误",
- headers={"WWW-Authenticate": "Basic"},
- )
-
-
- return credentials
-
- @app.get("/login")
- def login(credentials: Annotated[HTTPBasicCredentials, Depends(check)]):
- print(f'username: {credentials.username}, password: {credentials.password}')
- return '登录成功'
-
- if __name__ == '__main__':
- uvicorn.run(app, host='0.0.0.0', port=7777)
调用结果:
输入正确账号:
输入错误账号:
当检测到用户输入的凭据不正确时,返回HTTPException并设置状态码为401,同时添加WWW-Authenticate头以使浏览器再次显示登录提示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。