一文掌握异步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 的最小公倍…

PDF工具类源码

PDF-Guru: PDF Guru Anki是一款以PDF为中心的多功能办公学习工具箱软件&#xff0c;包含四大板块功能&#xff1a;PDF实用工具箱、Anki制卡神器、Anki最强辅助、视频笔记神器&#xff0c;软件功能众多且强大&#xff0c;熟练运用可以大幅提高办公和学习效率&#xff0c;绝对是您…

在 MySQL 中,添加索引后,插入、更新和删除操作的性能通常会变慢的原因

在 MySQL 中&#xff0c;添加索引后&#xff0c;插入、更新和删除操作的性能通常会变慢。这是因为索引的存在增加了这些操作的复杂性和开销。 1. 索引维护成本 索引是一种数据结构&#xff0c;用于加速数据的查找。常见的索引类型包括 B-Tree 索引、哈希索引等。当插入、更新…

在文件里引用目录文件下的静态资源图片不显示

问题&#xff1a;两种图片路径的指定方式&#xff0c;第一种能展示图片但第二种不能 两个 示例中&#xff0c;图片展示的差异。 在第一个示例中&#xff0c;图片路径是硬编码在 标签的 src 属性中的&#xff1a; <img src"../../assets/img/header01.png" style…

线性可分支持向量机的原理推导 线性分隔超平面关于任意样本点 (x_i,y_i)的函数间隔 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-1 用来表达训练集样本点 ( x i , y i ) (\mathbf{x}_i, y_i) (xi​,yi​) 到线性可分支持向量机分离超平面的距离。 d ^ i y i ( w ⋅ x i b )…

配置websocket消息代理类AbstractBrokerRegistration

在Spring Framework的Spring Messaging和Spring WebSocket模块中&#xff0c;StompBrokerRelayRegistration、SimpleBrokerRegistration和AbstractBrokerRegistration是用于配置WebSocket消息代理&#xff08;broker&#xff09;的关键类。这些类通常在配置WebSocket消息代理时…

【学习笔记】网络设备(华为交换机)基础知识 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

青少年编程能力等级测评CPA C++ 四级试卷(1)

青少年编程能力等级测评CPA C 四级试卷&#xff08;1&#xff09; 一、单项选择题&#xff08;共15题&#xff0c;每题3分&#xff0c;共45分&#xff09; CP4_1_1.在面向对象程序设计中&#xff0c;与数据构成一个相互依存的整体的是&#xff08; &#xff09;。 A. 对数据…

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

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

那些年,为了拿高薪看过的面试题

1. 计算机网络 1、什么是计算机网络 2、什么是协议 3、什么是IP地址 4、什么是子网 5、什么是DNS 6、什么是NAT 7、什么是带宽和延迟 8、什么是VPN 9、路由器和交换机的区别 10、OSI与TCP/IP模型 11、TCP与UDP的区别 12、TCP三次握手四次挥手 13、HTTP和HTTPS的区…

member access within null pointer of type ‘ListNode‘

文章目录 前言一、空指针解引用二、访问已释放的内存三、 结构体定义问题四、错误的链表操作五、代码上下文六、示例代码七、调试建议 前言 p -> next p1; p1 p1 -> next; p p->next;runtime error: member access within null pointer of type ListNode如果出现…

编辑器加载与AB包加载组合

解释&#xff1a; 这个 ABResMgr 类是一个资源加载管理器&#xff0c;它用于整合 AB包&#xff08;Asset Bundle&#xff09;资源加载和 编辑器模式资源加载。通过这个管理器&#xff0c;可以根据开发环境选择资源加载方式&#xff0c;既支持 运行时使用Asset Bundle加载&…

leetcode hot100【LeetCode 234. 回文链表】java实现

LeetCode 234. 回文链表 题目描述 请判断一个链表是否为回文链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;false进阶&#xff1a; 你能否用 O(n) 时间复杂度和 O(1) …

【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;请…