一文掌握异步web框架FastAPI(七)-- 安全(XSS 和 CSRF 防护、权限和角色控制、审计日志、使用安全的随机数生成、API 文档保护、会话管理)

 接上篇:一文掌握异步web框架FastAPI(六)-- 安全(HTTP验证、Bearer Token、Session、OAuth2 和 OpenID Connect、HTTPS 和 TLS、速率限制)-CSDN博客

目录

九、安全

7、XSS 和 CSRF 防护

1)XSS防护

2)CSRF防护

8、安全的数据存储

9、环境变量管理

10、权限和角色控制

1)基于内存,仅用于演示

2)使用sqlite3(python已内置)

3)使用mysql

11、审计日志

12、使用安全的随机数生成

13、API 文档保护

14、会话管理


九、安全


7、XSS 和 CSRF 防护

虽然 FastAPI 本身不直接处理这些问题,但它与 Starlette 一起提供了工具来设置 cookie 的安全标志,这有助于防止 CSRF 攻击。同时,良好的编码实践和使用模板引擎(如 Jinja2)中的转义机制可以帮助防范 XSS 攻击。

1)XSS防护

XSS(Cross-Site Scripting,跨站脚本)是一种常见的网络安全漏洞,它允许攻击者在受害者的浏览器中执行恶意脚本。这些脚本可以访问在浏览器中为网站存储的所有数据,如会话cookie。如果这些cookie包含敏感信息,如认证令牌,攻击者可以利用这些信息来冒充受害者。

XSS攻击允许攻击者在用户的浏览器中执行恶意脚本。FastAPI本身不提供内置的XSS防护,但可以通过以下方式来防护:

使用模板引擎的自动转义功能:如果使用Jinja2等模板引擎,确保开启自动转义功能。Jinja2默认会自动转义所有变量输出。

为什么要转义?

在Web应用中,为了防止跨站脚本攻击(XSS),任何用户输入的内容在显示到页面上之前都应该进行转义处理。转义是指将一些特殊字符(如<, >, &, "等)转换成它们的HTML实体形式,这样浏览器在解析HTML时就不会将其当作有效的HTML标签或脚本执行。

再具体解释下:

  • 未转义的<script>标签

如果用户输入的内容包含<script>alert('XSS')</script>,并且这个内容直接被插入到HTML页面中,浏览器会解析并执行这个脚本,导致弹出一个警告框。这就是一个典型的XSS攻击。

  • 转义后的内容

如果对用户输入的内容进行转义处理,<script>alert('XSS')</script>会被转换成&lt;script&gt;alert('XSS')&lt;/script&gt;

在这种情况下,浏览器会将这些内容当作普通文本显示,而不会解析和执行其中的脚本。

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from markupsafe import escapeapp = FastAPI()
templates = Jinja2Templates(directory="templates")  # 加载模板文件, 目录名为templates@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request, user_input: str = ""):# 使用Jinja2的自动转义功能safe_input = escape(user_input)return templates.TemplateResponse("index.html", {"request": request, "user_input": safe_input})if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)

请求:

import requests# 发送包含潜在XSS攻击代码的请求
response = requests.get("http://127.0.0.1:8000/?user_input=<script>alert('XSS')</script>")
# 检查响应内容
print(response.status_code)
print(response.text)

index.html要放在templates目录下。

<!DOCTYPE html>
<html>
<head><title>XSS Protection Example</title>
</head>
<body>
<h1>Welcome to the XSS Protection Example</h1>
<p>User Input: {{ user_input }}</p>
</body>
</html>

2)CSRF防护

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击手段,它利用合法用户的权限来执行非授权的操作。攻击者通过伪装成合法用户向Web应用程序发送请求,从而执行非预期的操作,如更改密码、转账等。

CSRF攻击的工作原理:

  • 1、用户登录

用户登录到一个网站,并且浏览器保存了该网站的Cookie。

  • 2、攻击者构建恶意链接

攻击者构建一个包含恶意请求的URL,这个请求指向受害者的账户所在网站,并且包含一些预定义的操作,如转账、更改邮箱地址等。

  • 3、用户点击恶意链接

用户在不知情的情况下点击了包含恶意请求的URL。此时,用户的浏览器会自动附带上先前保存的Cookie(因为Cookie是自动发送的)。

  • 4、请求发送到服务器

包含恶意请求的HTTP请求被发送到了受害者的账户所在的网站,由于请求包含了正确的Cookie,所以服务器认为这是合法用户的请求。

  • 5、服务器执行请求

服务器根据请求的内容执行了相应的操作,如转账等。

CSRF攻击的示例:

假设一个银行网站有一个转账功能,URL如下:

http://bank.com/transfer?from=12345&to=67890&amount=1000

攻击者可以构建一个恶意链接:

http://bank.com/transfer?from=12345&to=attacker&amount=1000

当用户点击这个链接时,如果用户已经登录并且浏览器保存了银行的Cookie,这个请求会被发送到银行服务器,服务器会认为这是合法用户的请求,从而执行转账操作。

from fastapi import FastAPI, Request, Form, Depends, HTTPException
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi.middleware.cors import CORSMiddleware
from starlette.middleware.sessions import SessionMiddleware
from itsdangerous import URLSafeTimedSerializer
from typing import Optionalapp = FastAPI()
# 配置Session和CSRF
app.add_middleware(SessionMiddleware, secret_key="your_secret_key")
# 配置CORS
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)
templates = Jinja2Templates(directory="templates")def generate_csrf_token(request: Request):"""生成CSRF令牌。"""serializer = URLSafeTimedSerializer(request.app.state.secret_key)return serializer.dumps(request.session["session_id"], salt="csrf")def verify_csrf_token(request: Request, csrf_token: str):"""验证CSRF令牌的有效性。"""serializer = URLSafeTimedSerializer(request.app.state.secret_key)try:session_id = serializer.loads(csrf_token, salt="csrf", max_age=3600)if session_id != request.session["session_id"]:raise HTTPException(status_code=400, detail="CSRF token validation failed")except:raise HTTPException(status_code=400, detail="CSRF token validation failed")@app.on_event("startup")
def startup_event():"""应用启动事件,设置全局 secret_key。"""app.state.secret_key = "your_secret_key"  # 设置全局 secret_key@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):"""根路由处理程序,生成CSRF令牌并返回首页。"""request.session["session_id"] = request.session.get("session_id", "session_id")csrf_token = generate_csrf_token(request)return templates.TemplateResponse("index.html", {"request": request, "csrf_token": csrf_token})@app.post("/submit")
async def submit(request: Request, username: str = Form(...), csrf_token: str = Form(...)):"""处理表单提交,验证CSRF令牌并返回用户名。"""verify_csrf_token(request, csrf_token)return {"username": username}if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)

请求:

import requests# 验证CSRF防护
session = requests.Session()
# 获取CSRF令牌
response = session.get("http://127.0.0.1:8000/")
csrf_token = response.text.split('name="csrf_token" value="')[1].split('"')[0]
print("\nCSRF Token:", csrf_token)
# 正确的CSRF令牌请求
data = {"username": "testuser","csrf_token": csrf_token

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…

LeetCode_2413. 最小偶倍数_java

1、问题 2413. 最小偶倍数https://leetcode.cn/problems/smallest-even-multiple/给你一个正整数 n &#xff0c;返回 2 和 n 的最小公倍数&#xff08;正整数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;10 解释&#xff1a;5 和 2 的最小公倍…

【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置

提示&#xff1a;学习华为交换机堆叠配置&#xff0c;含堆叠的概念、功能、角色、ID和优先级&#xff1b;堆叠的建立过程以及注意事项&#xff1b;包含堆叠的配置命令&#xff0c;以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…

解码专业术语——应用系统开发项目中的专业词汇解读

文章目录 引言站点设置管理具体要求包括&#xff1a; Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池&#xff1f;优化的优势 利用反射改造后端代码&#xff0c;AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…

『完整代码』按钮开关UI界面

创建按钮Button 作为开关坐骑UI界面的按钮 创建Image 作为坐骑UI界面 在父类脚本添加其中函数即可 绑定脚本在父类窗口对象 在按钮上响应事件 隐藏UI界面 运行项目 - 实现点击按钮开关UI界面 再次点击按钮 - 关闭UI界面 end

想让前后端交互更轻松?alovajs了解一下?

作为一个前端开发者&#xff0c;我最近发现了一个超赞的请求库 alovajs&#xff0c;它真的让我眼前一亮&#xff01;说实话&#xff0c;我感觉自己找到了前端开发的新大陆。大家知道&#xff0c;在前端开发中&#xff0c;处理 Client-Server 交互一直是个老大难的问题&#xff…

【C++训练营】现代C++编程(隐藏)

一、面向对象的特性 1.1 编码规范 1.1.1 效率 时间/空间&#xff1a;计算相关逻辑的时间复杂度和空间复杂度内存&#xff1a;考虑内存占用和cache命中率堆/栈&#xff1a;从生存周期、内存管理复杂性、对象大小等角度来考虑堆栈应用存储&#xff1a;考虑存储护具方式和读取方…

使用docker-compose搭建redis7集群-3主3从

下面是一个用于搭建 Redis 集群的 docker-compose.yml 示例文件&#xff0c;它会启动 6 个 Redis 节点&#xff08;3 主节点 3 从节点&#xff09;来构成一个最小的 Redis 集群。 同一个容器内网通讯没问题&#xff0c;但是你要是需要暴露到外网你需要用第二个yml 内网的 v…

信雅纳Chimera 100G网络损伤仪助力Parallel Wireless开展5G RAN无线前传网络的损伤模拟

背景介绍 Parallel Wireless 为移动运营商提供唯一全覆盖的(5G/4G/3G/2G&#xff09;软件支持的本地 OpenRAN (ORAN) 解决方案。该公司与全球 50 多家领先运营商合作&#xff0c;并被 Telefonica 和 Vodafone 评为表现最佳的供应商。Parallel Wireless 在多技术、开放式虚拟化…

从头学PHP之运算符

关于运算符的图片均来自网络&#xff0c;主要是自己写太麻烦了&#xff0c;程序是个简化自己工作量的方式&#xff0c;能复制粘贴就不要手写了&#xff08;建议初期还是多写写&#xff0c;加深下记忆&#xff09;在这里我就偷个懒&#xff0c;图片涉及到侵权及时&#xff0c;请…

实现酒店搜索框自动补全

前言 现在&#xff0c;hotel索引库还没有设置拼音分词器&#xff0c;需要修改索引库中的配置。但是知道索引库是无法修改的&#xff0c;只能删除然后重新创建。 另外&#xff0c;需要添加一个字段&#xff0c;用来做自动补全&#xff0c;将brand、suggestion、city等都放进去…

小程序无法获取头像昵称以及手机号码

用户在使用小程序的时候&#xff0c;登录弹出获取昵称头像或者个人中心点击默认头像弹窗获取头像昵称的时候&#xff0c;点击弹窗中的头像昵称均无反应&#xff0c; 这个是因为你的小程序隐私政策没有更新&#xff0c;或者老版本没有弹窗让用户同意导致的 解决办法&#xff1…

SpringBoot:举例说明如何使用@ControllerAdvice处理全局异常

使用RestController开发web接口时&#xff0c;需要处理Controller层未捕获的异常&#xff0c;提高系统的健壮性。 一般常用的方式是采用ControllerAdvice和ExceptionHandler&#xff0c;举例如下&#xff1a; ControllerAdvice public class ControllerAdvice {ExceptionHand…

UML外卖系统报告(包含具体需求分析)

1、系统背景 随着互联网技术的快速发展&#xff0c;外卖订餐服务逐渐成为人们生活中的一部分。传统的电话订餐方式面临诸多不便和限制&#xff0c;而基于互联网的外卖订餐系统则提供了更加便捷、快速和高效的订餐服务。这种系统通过将餐厅、顾客和配送人员连接起来&#xff0c…

截屏工具,

1&#xff0c;pc端的shiftwins&#xff0c;或者是prtsc按钮&#xff0c;但是有时候容易失效 2&#xff0c;第三方工具&#xff1a;Snipaste Snipaste - 截图 贴图 用户手册见Snipaste **常用F2或者是F3快捷键&#xff0c;切换桌面&#xff0c;而不是下端一个一个点击窗口页面…

论文阅读与写作入门

文章目录 1.阅读第一篇论文(1)论文结构(2)目标 2.使用GPT辅助论文的阅读与写作3.专有名词(1)架构(2)网络(3)机器学习 4.文献翻译软件5.从哪里下载文献&#xff1f;6.如何判断(你自己的)研究工作的价值or贡献【论文精读李沐】7.经典论文(1)AlexNet 2012(2)FCN 全卷积 2014(3)Res…

【Go语言】语法基础之变量、数据类型详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Go语言探索之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Go语言简介 2、Go语言特点 二、变量 1、变量的声明与初始化 2、变量…

【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的讲解

文章目录 前言 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助&#xff01…

时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard

Thingsboard 中“设备配置”和“设备”的关系是一对多的关系&#xff0c;通过设备配置为每个设备设置不同的配置&#xff0c;每个设备都会有一个与其关联的设备配置文件。等等&#xff0c;这不就是TDengine 中超级表的概念&#xff1a; 超级表是一种特殊的表结构&#xff0c;用…

【功能安全】汽车功能安全个人认证证书

目录 1、证书 2、课程信息 &#x1f4d6; 推荐阅读 1、证书 汽车功能安全工程师去拿类似莱茵、SGS、南德颁发的证书&#xff0c;如下&#xff1a; 2、课程信息 一般上什么课程了&#xff0c;课程信息大概如下&#xff1a; 汽车功能安全工程师认证课 &#xff08;3天&#…