扫描二维码

关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

第一章:基础安全框架认知

一、Web 安全三要素

1.1 机密性(Confidentiality)

原理说明

数据在传输和存储过程中仅对授权方可见,通过加密算法实现数据保护。FastAPI 默认支持 HTTPS 协议,使用 TLS 加密通信信道。

FastAPI 实践

# 安装依赖
# uvicorn[standard]==0.17.6
# cryptography==38.0.4 from fastapi import FastAPI
import ssl app = FastAPI() # HTTPS配置示例
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain("domain.crt", keyfile="domain.key") @app.get("/secure-data")
async def get_secure_data():
return {"message": "This data is encrypted via HTTPS"}

1.2 完整性(Integrity)

实现方式

使用哈希校验和数字签名确保数据未被篡改。FastAPI 通过 Pydantic 模型进行请求数据验证。

数据验证示例

# pydantic==1.10.7
from pydantic import BaseModel class Transaction(BaseModel):
amount: float
recipient: str
signature: str # 数字签名字段 @app.post("/transfer")
async def fund_transfer(tx: Transaction):
# 验证签名逻辑
if not validate_signature(tx.signature):
raise HTTPException(400, "Invalid transaction signature")
return {"status": "completed"}

1.3 可用性(Availability)

防护策略

通过请求速率限制保障服务稳定。使用 Redis 实现分布式限流。

# fastapi-limiter==0.1.5
# redis==4.5.4
from fastapi import Request
from fastapi_limiter import Limiter
from fastapi_limiter.depends import RateLimiter limiter = Limiter(key_func=lambda: "global")
app.state.limiter = limiter @app.get("/api/data")
@limiter.limit("10/minute")
async def get_data(request: Request):
return {"data": "Important resource"}

二、HTTPS 传输层加密

2.1 TLS 握手流程

sequenceDiagram
participant Client
participant Server
Client->>Server: ClientHello (支持的加密套件)
Server->>Client: ServerHello (选定加密套件) + 证书
Client->>Server: 验证证书 + 生成预主密钥
Server->>Client: 完成握手
Note over Client,Server: 开始加密通信

2.2 证书配置实战

# 生成自签名证书
openssl req -x509 -newkey rsa:4096 -nodes -out domain.crt -keyout domain.key -days 365

三、安全威胁防御

3.1 XSS 防护

场景示例

用户评论输入 <script>alert(1)</script> 时的防御

from fastapi import HTTPException
from html import escape @app.post("/comments")
async def create_comment(content: str):
# 自动转义HTML字符
sanitized_content = escape(content)
save_to_db(sanitized_content)
return {"status": "created"}

3.2 CSRF 防护

令牌验证实现

# fastapi-csrf-protect==0.1.1
from fastapi_csrf_protect import CsrfProtect @CsrfProtect.load_config
def get_csrf_config():
return {"secret_key": "SECRET_KEY"} @app.post("/transfer")
async def bank_transfer(
request: Request,
csrf_protect: CsrfProtect = Depends()
):
csrf_protect.validate(request)
# 执行业务逻辑

3.3 SQL 注入防护

ORM 安全实践

# SQLAlchemy==1.4.39
from sqlalchemy import text # 危险写法(易受注入攻击)
stmt = text(f"SELECT * FROM users WHERE name = '{name}'") # 安全写法(参数化查询)
safe_stmt = text("SELECT * FROM users WHERE name = :name").bindparams(name=name)

课后Quiz

问题1

当收到包含<img src=x onerror=alert(1)>的用户输入时,如何处理最安全?

A) 直接存入数据库

B) 使用HTML转义

C) 截断超过50字符的内容

答案解析

正确答案B。通过html.escape()将特殊字符转换为实体(如&lt;),可有效防止浏览器执行恶意脚本。

常见报错解决

报错422 Validation Error

产生原因

请求体不符合Pydantic模型定义的数据类型

解决方案

  1. 检查请求头Content-Type: application/json
  2. 使用Swagger文档测试接口
  3. 打印模型校验错误详情:
@app.exception_handler(RequestValidationError)
async def validation_handler(request, exc):
print(f"Validation error: {exc.errors()}")

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

,阅读完整的文章:如何在FastAPI中打造坚不可摧的Web安全防线?

往期文章归档:

如何在FastAPI中打造坚不可摧的Web安全防线?的更多相关文章

  1. 如何在PB中调用 Microsoft WEB 浏览器 控件?

    PB中使用Microsoft Web Browser控件步骤: 在pb的某窗口中加入OLE对象,选择Insert control(插入控件),然后选中"Microsoft WEB 浏览器&q ...

  2. JavaWeb学习(三) : 如何在 Eclipse 中创建一个Web 项目并成功运行?

    前置条件 : 1.确保已安装 Eclipse.Tomcat 服务器安装包 2.jdk.环境变量都已配置成功. 3.注意在安装 Eclipse 时一定要选择第二个有 Web 项目的进行安装, 不然安装成 ...

  3. 如何在Linux中tomcat下运行一个web项目

    如何在Linux中tomcat下运行一个web项目 然后启动Tomcat项目.运行的运行后会自动将war包解压. 如果页面报404,那么请查看tomcat日志文件,它一定是报错了....

  4. 如何在 CentOS 8 中安装 Cockpit Web 控制台

    如何在 CentOS 8 中安装 Cockpit Web 控制台 [日期:2019-10-31] 来源:Linux公社  作者:醉落红尘 [字体:大 中 小]   在本文中,我们将帮助您在CentOS ...

  5. 集群: 如何在spring 任务中 获得集群中的一个web 容器的端口号?

    系统是两台机器, 跑四个 web 容器, 每台机器两个容器 . nginx+memcached+quartz集群,web容器为 tomcat . web 应用中 用到spring 跑多个任务,任务只能 ...

  6. [Web 前端] 如何在React中做Ajax 请求?

    cp from : https://segmentfault.com/a/1190000007564792 如何在React中做Ajax 请求? 首先:React本身没有独有的获取数据的方式.实际上, ...

  7. 如何在 Azure 中创建 ASP.NET Web 应用

    Azure Web 应用提供高度可缩放.自修补的 Web 托管服务. 本快速入门演示如何将第一个 ASP.NET Web 应用部署到 Azure Web 应用中. 完成后,便拥有了一个资源组,该资源组 ...

  8. 如何在java代码中调用一个web项目jsp或者servlet

    有时候需要调用一个web项目的jsp或者servlet,但是执行内部的代码,并不是打开jsp,例如需要在一段java代码中清除一个web项目中的缓存,那么可以把清除缓存的代码放在该web项目的一个se ...

  9. 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧

    做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...

  10. 如何在springMVC 中对REST服务使用mockmvc 做测试

    如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试  spring 集成测试中对mock 的集成实在是太棒了!但 ...

随机推荐

  1. swich语句

    1.switch语句格式 括号内的是待匹配内容,然后case后的是被匹配内容,如果括号内的内容与case后的内容一致,则会打印语句体 . 2.实操(后面的省略了) 3.注意事项 1.case后面的值不 ...

  2. Oracle - ORA-19809: 超出了恢复文件数的限制

    场景重现 使用rman执行以下命令进行数据库备份的时候出现异常: RMAN> backup database; 出现如下错误: # 主要异常信息如下: # ... RMAN-00571: === ...

  3. Hystrix两种隔离方式对比

    ​在微服务架构中,我们不可避免的与Hystrix打交道,最近在面试过程中,也总是被问到Hystrix两种熔断方式的区别,今天,就给大家做个小结. 首先,Hystrix熔断方式主要有两种: 线程池隔离 ...

  4. kettle介绍-Step之加密及解密

    加密 进入kettle的安装目录 cd /d D:\Application\pdi-ce-6.0.0.0-353\data-integration windows系统命令行执行:Encr.bat -k ...

  5. 一天 Star 破万的开源项目「GitHub 热点速览」

    虽然现在市面上的 AI 编程助手已经"琳琅满目",但顶流就是顶流!OpenAI 新开源的轻量级编程助手 Codex,发布不到 24 小时 Star 数就轻松破万!姗姗来迟的 Ope ...

  6. Java AI(智能体)编排开发就用 Solon Flow

    本例参考 dify 的 chatFlow 的效果,模拟实现视频内容: https://www.toutiao.com/video/7455114080131482152/ Solon Flow 是一个 ...

  7. Cline技术分析:基于Cline Prompt的File Tools MCP Server实现

    我们将基于Cline prompt技术,构建一个基于MCP协议的文件工具服务器.我们将从任务定义开始,并在任务执行过程中探讨各个关键环节. 任务提示词定义 1. 访问[hub.gitmirror.co ...

  8. 【笔记】用伽马函数证明标准正态分布EX4的值为3

    2020-11-13 看了博客标准正态分布的E(X^4)积分求解的极坐标变换证明方法,已经叹服不已,然后看了底下老哥的评论,用伽马函数可以口算出来,遂去查了一下,真香!发篇博客记录一下. 现在的问题, ...

  9. .net core workflow流程定义

    .net core workflow流程定义 WikeFlow官网:http://www.wikesoft.com WikeFlow学习版演示地址:http://workflow.wikesoft.c ...

  10. 一文速通Python并行计算:10 Python多进程编程-进程之间的数据共享-基于共享内存和数据管理器

    一文速通 Python 并行计算:10 Python 多进程编程-进程之间的数据共享-基于共享内存和数据管理器 摘要: Python 多进程通信中,共享内存通过 Value 和 Array 实现高效数 ...