Flask中secret_key設(shè)置方式解析
app.secret_key = os.urandom(24)
在 Flask 中,app.secret_key = os.urandom(24) 這行代碼用于生成并設(shè)置一個(gè)安全的隨機(jī)密鑰(Secret Key),這是 Flask 應(yīng)用中非常重要的配置之一。
以下是詳細(xì)解析:
?1. app.secret_key的作用?
- ?會(huì)話(Session)加密?:Flask 使用
secret_key對(duì)客戶端會(huì)話(Session)數(shù)據(jù)進(jìn)行簽名和加密,防止篡改(如用戶認(rèn)證狀態(tài)、臨時(shí)數(shù)據(jù)等)。 - ?CSRF 保護(hù)?:部分 Flask 擴(kuò)展(如
Flask-WTF)依賴secret_key生成 CSRF 令牌,防止跨站請(qǐng)求偽造攻擊。 - ?安全簽名?:用于其他需要加密簽名的場(chǎng)景(如生成安全令牌、URL 簽名等)。
?2. os.urandom(24)詳解?
?功能?:os.urandom(size) 是 Python 的 os 模塊提供的函數(shù),用于生成指定長度的加密安全的隨機(jī)字節(jié)串?(基于操作系統(tǒng)提供的隨機(jī)源,如 /dev/urandom)。
?**參數(shù) 24**?:
- 24 字節(jié)(即 192 位)的隨機(jī)數(shù)據(jù)是一個(gè)常見的安全推薦值,足夠抵抗暴力.破解。
- 過短(如 16 字節(jié))可能降低安全性,過長(如 32 字節(jié))則無必要。
?3. 為什么需要隨機(jī)生成???
?避免硬編碼密鑰?:直接寫入固定字符串(如 "my-secret-key")容易被泄露或猜測(cè)。
?動(dòng)態(tài)生成?:每次應(yīng)用重啟時(shí)生成新密鑰(適合開發(fā)環(huán)境),但生產(chǎn)環(huán)境需要固定密鑰:
否則重啟后會(huì)話會(huì)失效,用戶需要重新登錄。
生產(chǎn)環(huán)境推薦從環(huán)境變量讀取固定密鑰:
import os
app.secret_key = os.environ.get('FLASK_SECRET_KEY', os.urandom(24))?4. 生產(chǎn)環(huán)境最佳實(shí)踐?
?使用環(huán)境變量?:
# 生成一個(gè)永久密鑰(Linux/Mac) python -c 'import os; print(os.urandom(24).hex())' # 輸出示例:d3b07384d113edec49eaa6238ad5ff00c74c7d11
然后在部署時(shí)設(shè)置環(huán)境變量:
export FLASK_SECRET_KEY="生成的密鑰"
?配置文件?:將密鑰保存在安全的配置文件中(如 .env),并通過庫(如 python-dotenv)加載。
?5. 常見錯(cuò)誤?
?**未設(shè)置 secret_key**?:會(huì)導(dǎo)致
RuntimeError: The session is unavailable because no secret key was set.
?使用弱密鑰?:如 "12345" 或空字符串,會(huì)大幅降低安全性。
6. 秘鑰的作用?
from flask import Flask, request, jsonify, session
import os
app = Flask(__name__)
app.secret_key = os.urandom(24) # 設(shè)置一個(gè)密鑰,用于加密 session 數(shù)據(jù)
# 模擬用戶信息,實(shí)際項(xiàng)目中需要替換為真實(shí)的用戶信息
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'] = True
return 'Login successful', 200
else:
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:
# 用戶未登錄,返回未授權(quán)的狀態(tài)碼
return 'Unauthorized', 401
if __name__ == '__main__':
app.run(debug=True)秘鑰主要用于 ?加密會(huì)話(Session)數(shù)據(jù),具體作用包括:
- ?會(huì)話安全?:Flask 的 Session 默認(rèn)存儲(chǔ)在客戶端的 Cookie 中(通過簽名后的加密數(shù)據(jù))。秘鑰用于簽名和驗(yàn)證這些數(shù)據(jù),防止篡改。
- ?防止偽造?:沒有秘鑰時(shí),攻擊者可能偽造 Session 數(shù)據(jù)(如手動(dòng)設(shè)置
logged_in=True)。秘鑰確保只有服務(wù)器能生成有效的 Session。 - ?依賴的擴(kuò)展?:如果使用 Flask 的
flash消息、flask_login等擴(kuò)展,它們也需要秘鑰來保證安全。
7. 秘鑰的使用場(chǎng)景?
在代碼中,秘鑰直接影響以下功能:
??(1)session的讀寫?
?登錄時(shí)?:session['logged_in'] = True
這段數(shù)據(jù)會(huì)被 Flask 用秘鑰簽名后加密,存儲(chǔ)到客戶端的 Cookie 中。
?訪問 /get_info 時(shí)?:if 'logged_in' in session
Flask 會(huì)用秘鑰驗(yàn)證客戶端傳來的 Session 數(shù)據(jù)是否有效,防止偽造。
??(2) 錯(cuò)誤示例?
如果秘鑰為空或太簡單(如 '123'):
- Session 數(shù)據(jù)可能被破解或篡改。
- 攻擊者可以偽造 Cookie 繞過登錄驗(yàn)證。
8. 秘鑰的最佳實(shí)踐?
?生產(chǎn)環(huán)境?:不要使用 os.urandom(24) 動(dòng)態(tài)生成(每次重啟服務(wù)會(huì)變,導(dǎo)致舊 Session 失效)。應(yīng)該使用固定的強(qiáng)密碼(如從環(huán)境變量讀?。?/p>
app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'fallback-strong-key')?復(fù)雜度?:至少 24 字節(jié)的隨機(jī)字符(如通過 openssl rand -hex 24 生成)。
?保護(hù)秘鑰?:不要將秘鑰硬編碼在代碼中或上傳到版本控制(如 Git)。
9. 測(cè)試驗(yàn)證?
你可以嘗試以下操作來觀察秘鑰的作用:
- ?正常登錄?:用
username: admin,password: admin訪問/login,會(huì)返回一個(gè)加密的Set-Cookie頭。 - ?篡改 Cookie?:手動(dòng)修改 Cookie 中的
session值,服務(wù)端會(huì)因簽名驗(yàn)證失敗返回401。 - ?移除秘鑰?:刪除
app.secret_key后,Session 會(huì)無法正常工作。
?總結(jié)?
- ?開發(fā)環(huán)境?:
os.urandom(24)足夠便捷。 - ?生產(chǎn)環(huán)境?:務(wù)必使用固定且保密的密鑰(通過環(huán)境變量或配置管理工具)。
如果需要進(jìn)一步優(yōu)化安全性,可以結(jié)合 Flask 的 SESSION_COOKIE_SECURE、SESSION_COOKIE_HTTPONLY 等配置增強(qiáng)會(huì)話保護(hù)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python數(shù)據(jù)結(jié)構(gòu)與算法中的隊(duì)列詳解(1)
這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
Pandas sample隨機(jī)抽樣的實(shí)現(xiàn)
隨機(jī)抽樣,是統(tǒng)計(jì)學(xué)中常用的一種方法,本文主要介紹了Pandas sample隨機(jī)抽樣的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
python3調(diào)用windows dos命令的例子
今天小編就為大家分享一篇python3調(diào)用windows dos命令的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python中print()函數(shù)使用實(shí)例詳解
Python的print()函數(shù)可以打印輸出,常用來將內(nèi)容打印到控制臺(tái),print()是python中最常見的一個(gè)函數(shù),本文就通過一些實(shí)例來給大家講講如何使用print()函數(shù),需要的朋友可以參考下2023-07-07
python對(duì)一個(gè)數(shù)向上取整的實(shí)例方法
在本篇文章中小編給大家整理了關(guān)于python對(duì)一個(gè)數(shù)向上取整的實(shí)例方法,需要的朋友們可以跟著學(xué)習(xí)下。2020-06-06
Win10操作系統(tǒng)中PyTorch虛擬環(huán)境配置+PyCharm配置
本文主要介紹了Win10操作系統(tǒng)中PyTorch虛擬環(huán)境配置+PyCharm配置,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
ubuntu16.04升級(jí)Python3.5到Python3.7的方法步驟
這篇文章主要介紹了ubuntu16.04升級(jí)Python3.5到Python3.7的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

