当前位置: 首页 > article >正文

Flask中secret_key设置解析

app.secret_key = os.urandom(24)

在 Flask 中,app.secret_key = os.urandom(24) 这行代码用于生成并设置一个安全的随机密钥(Secret Key),这是 Flask 应用中非常重要的配置之一。以下是详细解析:


1. app.secret_key 的作用

  • 会话(Session)加密​:Flask 使用 secret_key 对客户端会话(Session)数据进行签名和加密,防止篡改(如用户认证状态、临时数据等)。
  • CSRF 保护​:部分 Flask 扩展(如 Flask-WTF)依赖 secret_key 生成 CSRF 令牌,防止跨站请求伪造攻击。
  • 安全签名​:用于其他需要加密签名的场景(如生成安全令牌、URL 签名等)。

2. os.urandom(24) 详解

  • 功能​:os.urandom(size) 是 Python 的 os 模块提供的函数,用于生成指定长度的加密安全的随机字节串​(基于操作系统提供的随机源,如 /dev/urandom)。
  • ​**参数 24**​:
    • 24 字节(即 192 位)的随机数据是一个常见的安全推荐值,足够抵抗暴力破解。
    • 过短(如 16 字节)可能降低安全性,过长(如 32 字节)则无必要。

3. 为什么需要随机生成?​

  • 避免硬编码密钥​:直接写入固定字符串(如 "my-secret-key")容易被泄露或猜测。
  • 动态生成​:每次应用重启时生成新密钥(适合开发环境),但生产环境需要固定密钥:
    • 否则重启后会话会失效,用户需要重新登录。
    • 生产环境推荐从环境变量读取固定密钥:
      import os
      app.secret_key = os.environ.get('FLASK_SECRET_KEY', os.urandom(24))

4. 生产环境最佳实践

  • 使用环境变量​:
    # 生成一个永久密钥(Linux/Mac)
    python -c 'import os; print(os.urandom(24).hex())'
    # 输出示例:d3b07384d113edec49eaa6238ad5ff00c74c7d11
    然后在部署时设置环境变量:
    export FLASK_SECRET_KEY="生成的密钥"
  • 配置文件​:将密钥保存在安全的配置文件中(如 .env),并通过库(如 python-dotenv)加载。

5. 常见错误

  • ​**未设置 secret_key**​:会导致 RuntimeError: The session is unavailable because no secret key was set.
  • 使用弱密钥​:如 "12345" 或空字符串,会大幅降低安全性。

6. 秘钥的作用

from flask import Flask, request, jsonify, session
import os
app = Flask(__name__)
app.secret_key = os.urandom(24) # 设置一个密钥,用于加密 session 数据
# 模拟用户信息,实际项目中需要替换为真实的用户信息
users = {
'123': 'admin',
'admin': 'admin'
}
# 登录接口
@app.route('/login', methods=['POST'])
def login():data = request.get_json()username = data.get('username')password = data.get('password')if username in users and users[username] == password:session['logged_in'] = Truereturn 'Login successful', 200else:return 'Login failed', 401
# 查询信息接口,需要登录才能访问
@app.route('/get_info')
def get_info():if 'logged_in' in session and session['logged_in']:# 用户已登录,返回用户信息return 'User Info: OK' # 返回用户信息else:# 用户未登录,返回未授权的状态码return 'Unauthorized', 401
if __name__ == '__main__':app.run(debug=True)

秘钥主要用于 ​加密会话(Session)数据,具体作用包括:

  • 会话安全​:Flask 的 Session 默认存储在客户端的 Cookie 中(通过签名后的加密数据)。秘钥用于签名和验证这些数据,防止篡改。
  • 防止伪造​:没有秘钥时,攻击者可能伪造 Session 数据(如手动设置 logged_in=True)。秘钥确保只有服务器能生成有效的 Session。
  • 依赖的扩展​:如果使用 Flask 的 flash 消息、flask_login 等扩展,它们也需要秘钥来保证安全。

7. 秘钥的使用场景

在代码中,秘钥直接影响以下功能:

​(1) session 的读写
  • 登录时​:session['logged_in'] = True
    这段数据会被 Flask 用秘钥签名后加密,存储到客户端的 Cookie 中。
  • 访问 /get_info 时​:if 'logged_in' in session
    Flask 会用秘钥验证客户端传来的 Session 数据是否有效,防止伪造。
​(2) 错误示例

如果秘钥为空或太简单(如 '123'):

  • Session 数据可能被破解或篡改。
  • 攻击者可以伪造 Cookie 绕过登录验证。

8. 秘钥的最佳实践

  • 生产环境​:不要使用 os.urandom(24) 动态生成(每次重启服务会变,导致旧 Session 失效)。应该使用固定的强密码(如从环境变量读取):
    app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'fallback-strong-key')
  • 复杂度​:至少 24 字节的随机字符(如通过 openssl rand -hex 24 生成)。
  • 保护秘钥​:不要将秘钥硬编码在代码中或上传到版本控制(如 Git)。

9. 测试验证

你可以尝试以下操作来观察秘钥的作用:

  1. 正常登录​:用 username: adminpassword: admin 访问 /login,会返回一个加密的 Set-Cookie 头。
  2. 篡改 Cookie​:手动修改 Cookie 中的 session 值,服务端会因签名验证失败返回 401
  3. 移除秘钥​:删除 app.secret_key 后,Session 会无法正常工作。

总结

  • 开发环境​:os.urandom(24) 足够便捷。
  • 生产环境​:务必使用固定且保密的密钥(通过环境变量或配置管理工具)。

如果需要进一步优化安全性,可以结合 Flask 的 SESSION_COOKIE_SECURESESSION_COOKIE_HTTPONLY 等配置增强会话保护。

相关文章:

Flask中secret_key设置解析

app.secret_key os.urandom(24) 在 Flask 中,app.secret_key os.urandom(24) 这行代码用于生成并设置一个安全的随机密钥(Secret Key),这是 Flask 应用中非常重要的配置之一。以下是详细解析: ​1. app.secret_key …...

事件不触发、交互失效?基于 WebDebugX 的移动端事件调试实战总结

在移动端开发中,“点击没反应”“滑动卡住”“长按无效”等事件类问题时常困扰开发者。这类问题不仅和逻辑代码有关,更常见的是出现在浏览器事件模型与设备行为之间的不一致,特别是在 WebView 环境下尤为显著。 本文结合多个真实案例&#x…...

记一次idea中lombok无法使用的解决方案

在注解处理器下,一般 Default 为“启用注解处理”和“从项目类路径获取处理器”,但是我的项目中的为选择“处理器路径”,导致了无法识别lombok,因此,需要改为使用“从项目类路径获取处理器”这个选项。如下图所示&…...

【Redis】笔记|第7节|大厂生产级Redis高并发分布式锁实战(二)

一、Redis主从架构锁失效问题解析 1. 核心问题背景 在Redis主从架构中,分布式锁失效的核心风险源于主从复制的异步特性和主节点故障后的角色切换。即使客户端仅操作主节点写入,主节点宕机时未同步的锁数据可能导致新主节点允许重复加锁。 2. 主从切换…...

WebRTC中sdp多媒体会话协议报文详细解读

sdp介绍 在WebRTC(Web实时通信)中,SDP(Session Description Protocol)是用来描述和协商多媒体会话的协议。它定义了会话的参数和媒体流的信息,如音视频编码格式、传输方式、网络地址等。SDP是WebRTC中一个…...

贪心算法应用:硬币找零问题详解

贪心算法与硬币找零问题详解 贪心算法(Greedy Algorithm)在解决优化问题时表现出简洁高效的特点,尤其适用于特定结构的组合优化问题。本文将用2万字篇幅,深入探讨贪心算法在硬币找零问题中的应用,覆盖算法原理、正确性…...

深入理解 x86 汇编中的重复前缀:REP、REPZ/REPE、REPNZ/REPNE(进阶详解版)

一、重复前缀:串操作的 “循环加速器” 如果你写过汇编代码,一定遇到过需要重复处理大量数据的场景: 复制 1000 字节的内存块比较两个长达 200 字符的字符串在缓冲区中搜索特定的特征值 手动用loop指令编写循环?代码冗长不说&a…...

计算机网络全维度解析:架构协议、关键设备、安全机制与新兴技术深度融合

计算机网络作为当今数字化社会的基石,其复杂性和应用广泛性远超想象。本文将从基础架构、协议体系、关键设备、安全机制到新兴技术,进行全方位、深层次的解析,并辅以实际应用场景和案例分析。 一、网络架构与分类的深度剖析 1.1 网络分类的立…...

Docker 在 AI 开发中的实践:GPU 支持与深度学习环境的容器化

人工智能(AI)和机器学习(ML),特别是深度学习,正以前所未有的速度发展。然而,AI 模型的开发和部署并非易事。开发者常常面临复杂的依赖管理(如 Python 版本、TensorFlow/PyTorch 版本、CUDA、cuDNN)、异构硬件(CPU 和 GPU)支持以及环境复现困难等痛点。这些挑战严重阻…...

学习NuxtLink标签

我第一次接触这个标签,我都不知道是干嘛的,哈哈哈哈,就是他长得有点像routerLink,所以我就去查了一下!哎!!!真是一样的,哈哈哈哈,至少做的事情是一样的&#…...

基于PostGIS的GeoTools执行原生SQL查询制图实践-以贵州省行政区划及地级市驻地为例

目录 前言 一、空间相关表简介 1、地市行政区划表 2、地市驻地信息表 3、空间查询检索 二、GeoTools制图实现 1、数据类型绑定 2、WKT转Geometry 3、原生SQL转SimpleFeatureCollection 4、集成调用 5、成果预览 三、总结 前言 在当今这个信息爆炸的时代&#xff0c…...

MySQL字段类型完全指南:选型策略与实战应用

引言 在数据库设计中,字段类型的选择直接影响数据存储效率、查询性能和系统稳定性。本文将系统梳理MySQL支持的字段类型,结合典型应用场景与避坑指南,助你构建高性能、易维护的数据库结构。 一、字段类型全景图 MySQL字段类型主要分为以下五…...

NLP实战(5):基于LSTM的电影评论情感分析模型研究

目录 摘要 1. 引言 2. 相关工作 3. 方法 3.1 数据预处理 3.2 模型架构 3.3 训练策略 3.4 交叉验证 4. 实验与结果 4.1 数据集 4.2 实验结果 4.3训练日志 4.4 示例预测 5. 讨论 6. 结论 附录代码 展示和免费下载 摘要 本文提出了一种基于双向LSTM的深度学习模…...

DHCP应用

一、DHCP介绍 在LAN(局域网)中我们常会遇到以下的情况: 1.不知道如何配置IP地址及相关信息的员工,无法上网;2.IP地址配置冲突,无法上网;3.来访用户因不熟悉公司网络情况无法上网; 以上这些情况都是日常最…...

基于MATLAB的FTN调制和硬判决的实现

在数字通信中,FTN(Full-Transmit-Null)是一种调制技术,用于在有限带宽的信道中传输数据。FTN调制通过在符号之间插入零值,使得频谱在符号速率的整数倍处为零,从而减少频谱重叠。硬判决是一种简单的解调方式…...

涂装协作机器人:重新定义涂装工艺的智能化未来

一、涂装场景的产业变革与核心诉求 1.1 千亿级市场的技术突围战 在汽车制造领域,涂装车间被称为"工业化妆间",其工艺质量直接影响产品溢价能力。当前行业面临三重挑战: 质量维度:传统人工喷涂存在膜厚波动15μm的行业…...

c++面向对象第4天---拷贝构造函数与深复制

含有对象成员的构造函数深复制与浅复制拷贝&#xff08;复制&#xff09;构造函数 第一部分&#xff1a;含有对象成员的构造函数 以下是一个学生 类包含日期成员出生日期的代码 #include<iostream> using namespace std; class Date { public:Date(int year,int month…...

Windows版PostgreSQL 安装 vector 扩展

问题 spring-ai在集成PGVector向量存储的时候会报错如下&#xff0c;那么就需要安装pgsql的vector扩展。 SQL [CREATE EXTENSION IF NOT EXISTS vector]; 错误: 无法打开扩展控制文件 "C:/Program Files/PostgreSQL/9.6/share/extension/vector.control": No such …...

KINGCMS被入侵

现象会强制跳转到 一个异常网站,请掉截图代码. 代码中包含经过混淆处理的JavaScript&#xff0c;它使用了一种技术来隐藏其真实功能。代码中使用了eval函数来执行动态生成的代码&#xff0c;这是一种常见的技术&#xff0c;恶意脚本经常使用它来隐藏其真实目的。 这段脚本会检…...

完美解决在pycharm中创建Django项目安装mysqlclient报错的问题(windows下)

正常情况下&#xff0c;在Windows安装mysqlclient会报错&#xff1a; 我这里用的是anaconda虚拟环境&#xff0c;安装前必须激活anacoda虚拟环境&#xff0c; 怎么激活虚拟环境&#xff1f;可以参考超详细的pycharmanaconda搭建python虚拟环境_pycharm anaconda环境搭建-CSDN博…...

『React』组件副作用,useEffect讲解

在 React 开发中&#xff0c;有时候会听到“副作用”这个词。特别是用到 useEffect 这个 Hook 的时候&#xff0c;官方就明确说它是用来处理副作用的。那什么是副作用&#xff1f;为什么我们要专门管控它&#xff1f;今天就聊聊 React 中的组件副作用。 &#x1f4cc; 什么是“…...

使用VSCode在WSL和Docker中开发

通过WSL&#xff0c;开发人员可以安装 Linux 发行版&#xff08;例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等&#xff09;&#xff0c;并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具&#xff0c;不用进行任何修改&#xff0c;也无需使用传统虚…...

ZooKeeper 命令操作

文章目录 Zookeeper 数据模型Zookeeper 服务端常用命令Zookeeper 客户端常用命令 Zookeeper 数据模型 ZooKeeper 是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似&#xff0c;拥有一个层次化结构。这里面的每一个节点都被称为&#xff1a; ZNode&#xff0c;每个节…...

解决 Ubuntu 20.04 虚拟机中 catkin_make 编译卡死问题

完整解决步骤 1. 禁用当前交换文件 sudo swapoff /swapfile 2. 删除旧的交换文件 sudo rm /swapfile 3. 使用更可靠的创建方法 # 使用 dd 命令创建交换文件&#xff08;更兼容但较慢&#xff09; sudo dd if/dev/zero of/swapfile bs1M count4096# 或者使用 truncate 命令…...

【HTML-15】HTML表单:构建交互式网页的基石

表单是HTML中最强大的功能之一&#xff0c;它允许网页收集用户输入并与服务器进行交互。无论是简单的搜索框、登录页面&#xff0c;还是复杂的多步骤调查问卷&#xff0c;表单都是实现这些功能的核心元素。本文将深入探讨HTML表单的各个方面&#xff0c;帮助您构建高效、用户友…...

一些较好的学习方法

1、网上有一些非常经典的电路&#xff0c;而且有很多视频博主做了详细的讲解。 2、有一部分拆解的UP主&#xff0c;拆解后会还原该器件的原理图&#xff0c;并一步步做讲解。 3、有两本书&#xff0c;数电、模电&#xff0c;这两本书中的内容很多都值得学习。 5、某宝上卖的…...

Redis底层数据结构之深入理解跳表(1)

在上一篇文章中我们详细的介绍了一下Redis中跳表的结构以及为什么Redis要引入跳表而不是平衡树或红黑树。这篇文章我们就来详细梳理一下跳表的增加、搜索和删除步骤。 SkipList的初始化 跳表初始化时&#xff0c;将每一层链表的头尾节点创建出来并使用集合将头尾节点进行存储&…...

鸿蒙【HarmonyOS 5】 (React Native)的实战教程

一、环境配置 ‌安装鸿蒙专属模板‌ bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ‌配置 ArkTS 模块路径‌ 在 entry/src/main/ets 目录下创建原生模块&…...

PCB设计教程【入门篇】——电路分析基础-元件数据手册

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、数据手册的重要…...

20250529-C#知识:继承、密封类、密封方法、重写

C#知识&#xff1a;继承、密封类、密封方法、重写 继承是面向对象的三大特性之一&#xff0c;通过继承能够减少重复代码的编写&#xff0c;有助于提升开发效率。 1、继承 C#不同于C&#xff0c;只支持单继承当子类出现与父类同名的成员时&#xff0c;父类成员被隐藏&#xff0…...