FastAPI 应用安全性:多层防护

ops/2024/12/16 11:13:11/

FastAPI 应用安全性:多层防护

目录
  1. 🛡️ 防御 SQL 注入、XSS 和 CSRF 攻击的实用方法
  2. 🔒 使用 HTTPS 保证数据传输安全
  3. ⚙️ 依赖更新与漏洞修复的安全管理策略

🛡️ 1. 防御 SQL 注入、XSS 和 CSRF 攻击的实用方法

在现代 Web 应用中,安全性是设计的核心环节,特别是需要防范常见的攻击向量如 SQL 注入、跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。合理的编码实践和框架工具可以显著减少这些安全威胁。

防止 SQL 注入

SQL 注入是通过构造恶意输入操纵数据库查询的攻击方式。为了防止此类问题,可以采用以下措施:

  1. 使用参数化查询
    参数化查询能够有效避免用户输入直接插入 SQL 语句中带来的风险。
  2. ORM(对象关系映射)框架
    ORM 框架如 SQLAlchemy 提供了安全的 API,可以避免直接书写 SQL 语句时的安全隐患。
代码示例:防御 SQL 注入

以下示例展示了如何使用 SQLAlchemy 的参数化查询来避免 SQL 注入:

python">from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmakerDATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)app = FastAPI()def get_db():"""数据库依赖注入"""db = SessionLocal()try:yield dbfinally:db.close()@app.get("/user/{user_id}")
def get_user(user_id: int, db=Depends(get_db)):"""获取指定用户的信息,防止 SQL 注入"""sql = text("SELECT * FROM users WHERE id = :id")user = db.execute(sql, {"id": user_id}).fetchone()if not user:raise HTTPException(status_code=404, detail="用户不存在")return {"user": dict(user)}

上述代码中,通过使用占位符 :id 和参数化方式有效防止了 SQL 注入风险。


防止 XSS 攻击

XSS 攻击通过将恶意脚本注入到网页中,使得用户在浏览页面时被迫执行这些脚本。可以通过以下方法防止 XSS 攻击:

  1. 输出时转义 HTML
    对所有输出到前端的内容进行严格的 HTML 转义。
  2. 限制用户输入内容
    验证和清理用户输入,避免注入恶意脚本代码。
代码示例:清理用户输入

以下代码演示了如何清理用户输入并输出安全的 HTML:

python">from fastapi import FastAPI
from pydantic import BaseModel
from html import escapeapp = FastAPI()class Comment(BaseModel):content: str@app.post("/submit_comment")
def submit_comment(comment: Comment):"""接收用户评论并防止 XSS 攻击"""# 转义用户输入以防止 XSSsafe_content = escape(comment.content)return {"message": "评论已保存", "content": safe_content}

通过转义用户输入,可以确保任何 <script> 或类似标签不会被直接执行。


防止 CSRF 攻击

CSRF 攻击通过伪造请求冒充用户执行恶意操作,可以通过以下方式防御:

  1. CSRF Token 验证
    生成唯一的 CSRF Token,并在每次提交时验证该 Token 是否匹配。
  2. 限制跨域请求
    配置 CORS 策略,限制跨域来源。
代码示例:CSRF Token 验证

以下是结合 CSRF Token 的示例:

python">from fastapi import FastAPI, Form, HTTPException
from fastapi.middleware.csrf import CsrfProtectapp = FastAPI()@app.post("/protected")
def protected_form(csrf_token: str = Form(...), csrf: CsrfProtect = Depends(CsrfProtect)):"""使用 CSRF Token 验证表单"""if not csrf.validate_csrf(csrf_token):raise HTTPException(status_code=403, detail="CSRF Token 验证失败")return {"message": "表单提交成功"}

通过启用 CSRF Token 验证,可以有效防止恶意跨站请求。


🔒 2. 使用 HTTPS 保证数据传输安全

HTTPS 是 Web 应用安全的基石,能够通过加密通信防止数据在传输过程中被窃取或篡改。以下是使用 HTTPS 的具体策略:

1. 配置 HTTPS 证书
  • 使用认证机构(CA)签发的 SSL/TLS 证书。
  • 利用 Let’s Encrypt 免费获取证书。
2. 强制 HTTPS

服务器配置应强制重定向所有 HTTP 请求至 HTTPS,以确保所有通信均通过加密传输。

3. 禁用旧协议

禁用 SSL 2.0、SSL 3.0 以及早期的 TLS 协议版本,仅支持 TLS 1.2 及以上版本。

代码示例:启用 HTTPS

以下是通过 Uvicorn 启用 HTTPS 的示例:

uvicorn app:app --host 0.0.0.0 --port 443 --ssl-keyfile=path/to/key.pem --ssl-certfile=path/to/cert.pem

通过指定 SSL 证书和密钥,Uvicorn 可以在生产环境中提供 HTTPS 服务。


⚙️ 3. 依赖更新与漏洞修复的安全管理策略

依赖管理是确保 Web 应用长期安全的重要环节。未及时更新的依赖库可能会导致安全漏洞暴露。

1. 定期更新依赖

通过工具(如 pip-toolspoetry)定期检查依赖项的版本,并升级到包含安全修复的最新版本。

2. 使用安全审计工具
  • Dependabot
    自动检测依赖中的漏洞,并生成安全补丁。
  • Bandit
    静态代码分析工具,用于检测 Python 代码中的安全问题。
3. 删除无用依赖

冗余依赖可能引入额外的安全隐患,应定期检查并移除未使用的库。

代码示例:依赖检查

以下示例展示了使用 pip-audit 检查依赖漏洞:

pip install pip-audit
pip-audit

工具会输出存在漏洞的依赖及修复建议。

代码示例:使用 Dependabot

以下是 GitHub Dependabot 的配置示例:

version: 2
updates:- package-ecosystem: "pip"directory: "/"schedule:interval: "weekly"

通过上述配置,可以自动化依赖检查和安全更新。


http://www.ppmy.cn/ops/142355.html

相关文章

从〇开始深度学习(番外)——混淆矩阵(Confusion Matrix)

从〇开始深度学习(番外)——混淆矩阵&#xff08;Confusion Matrix&#xff09; 文章目录 从〇开始深度学习(番外)——混淆矩阵&#xff08;Confusion Matrix&#xff09;写在前面1.混淆矩阵2.归一化混淆矩阵 写在前面 《从〇开始深度学习&#xff08;番外&#xff09;》系列主…

龙海家园地面停车场探寻2

在南山前海上班2年多了&#xff0c;到现在最喜欢的小区还是龙海家园小区。龙海家园小区是深圳目前最大的公共保障性租赁住房小区,目前居住有约2.6万人。而小区的停车位是远远不够的。之前一直很好奇车子可以停哪里。 后面加班之余经常去小区吃饭和转转。发现龙海家园小区与对面…

Dash for Mac 代码API文档管理软件安装

Mac分享吧 文章目录 Dash for Mac 代码API文档管理软件 效果图展示一、Dash 代码API文档管理软件 Mac电脑版——v7.3.31️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件2.1 左侧安装包拖入右侧文件夹中&#xff0c;等待安装完成&#xff0c;运行软件2.2 打开软件&#xff…

[数据分析] 探索性数据分析 EDA

数据分析 按数据分析的思维模式或者目的&#xff1a; 描述性分析&#xff1a;使用统计方法&#xff08;如均值、中位数、众数、方差等&#xff09;来描述数据的特征&#xff0c;总结和组织数据&#xff0c;以提供对数据集的清晰理解预测性分析&#xff1a;使用历史数据来建立…

开展新闻营销分为策划期、实施期、优化期三个重要阶段

也许有人会问&#xff1a;什么是新闻营销呢&#xff1f;这是一个在当今商业营销领域备受关注的概念。在信息爆炸的时代&#xff0c;企业都在绞尽脑汁寻找各种有效的营销方式来提升自己的品牌知名度、产品销量等&#xff0c;新闻营销便是其中一种重要的手段。 我们可以将“新闻营…

SpringBoot【八】mybatis-plus条件构造器使用手册!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 经过上一期的mybatis-plus 入门教学&#xff0c;想必大家对它不是非常陌生了吧&#xff0c;这期呢&#xff0c;我主要是围绕以下几点展开&#xff0c;重点给大家介绍 里…

网络通信技术

网络通信技术 IP路由基础 什么是路由 路由是指导报文转发的路径信息,通过路由可以确认转发IP报文的路径。路由设备是依据路由转发报文到目的网段的网络设备,最常见的路由设备:路由器。路由设备维护着一张路由表,保存着路由信息。路由的功能 路径选择数据转发、数据过滤维…

react-dnd 拖拽事件与输入框的文本选中冲突

问题描述 当我们使用拖拽库的时候&#xff0c;往往会遇到拖拽的一个元素他的子孙元素有输入框类型的dom节点&#xff0c;当拖拽的事件绑定在该元素身上时候&#xff0c;发现子孙的输入框不能进行文本选中了&#xff0c;会按住鼠标去选中文本的时候会触发拖拽 实际的效果&…