为什么 flask-session 是纯文本的?

Why is flask-session in plain text?

我创建了一个服务器端会话文件,我是 Web 应用程序的新手。我不明白为什么用文本文件打开的会话文件里面有纯内容。我有一个密钥设置,但是为什么它没有加密?

from flask import Flask, render_template, request, redirect, url_for, session, flash
from flask_sessions import Session

app = Flask(__name__)
app.config['SECRET_KEY'] = 'keykeykey'
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
app.config['SESSION_USE_SIGNER'] = True
server_session = Session(app)

并且在登录时文件路径是

app.route('/login', methods=['GET', 'POST'])
def login_page():
   session['email'] = email
   return redirect(url_for('home_page'))

注销时路由为

@app.route("/logout")
def logout():
    session.pop('email', None)
    return redirect(url_for("home_page"))

当会话开始时,在 dir/flask-sessions/2029240f6d1128be89ddc32729463129 中创建了一个文件,每次生成两个文件,当我用记事本打开它时,我可以看到纯文本的电子邮件 ID

Mø`.€•i       }”(Œ
_permanent”ˆŒ
csrf_token”Œ(fb90d22be1adc1237c52730fadf95d1e07936cdd9e”Œemail”Œemail@email.com”u.

结尾email@email.com是表格的输入。

我的问题是

  1. 为什么存储在我的服务器中的内容没有加密?
  2. 当我这样做时 session.pop() 为什么文件没有被删除?

编辑: 我想这个问题是因为我使用 from cachelib import FileSystemCache 而不是 from werkzeug.contrib.cache import FileSystemCache?那是问题吗?我怎样才能克服这个问题,因为最新版本的 werkzeug 没有 .contrib

尽我所知尝试回答。

1)为什么内容没有加密?

只要您的服务器是安全的,您就不必真正担心存储在服务器中的会话。该漏洞是在浏览器中存储为 cookie 的会话。为了绕过它,'SECRET_KEY' 用于让服务器在将会话变量存储在浏览器之前对其进行签名。这就是为什么您仍然可以在服务器上看到纯文本会话的原因。不过,它将在浏览器 cookie 数据中签名。

2) 当我执行 session.pop() 为什么文件没有被删除?

为了理解 session.pop 的作用,我做了一些练习。 一开始,我的 Flask 会话是这样的:

Session is:  <SecureCookieSession {'id': '27260b14-405d-440a-9e38-daa32d9a7797', 'loggedin': True, 'username': 'Rajat Yadav'}>

当我弹出会话字典映射中的所有键时,我留下了这个:

New Session is:  <SecureCookieSession {}>

清楚的是 key:value 对在我们弹出会话时被删除。可以肯定的是,pop 不会删除完整的字典对象,而只会删除其中的 key:value 对。 对于您关于文件未被删除的问题,我相信删除字典对象应该可以解决问题。 尝试:

del session

如果这会删除文件,请告诉我。