根据official doc:
会话
除了请求对象外,还有一个名为会话的第二个对象,它使您可以存储从一个请求到下一个请求的特定于用户的信息。这是在您的cookie之上实现的,并以加密方式对cookie进行签名。这意味着用户可以查看您Cookie的内容,但不能对其进行修改,除非他们知道用于签名的密钥。
要使用会话,您必须设置一个秘密密钥。
在不考虑语句“ 用户可以查看您的Cookie的内容但不能修改”的情况下,我发现this tool对Flask Session Cookie进行了解码,因此我尝试执行模拟使用以下此应用程序(出于POC目的):
from flask import Flask, session
app = Flask(__name__)
@app.route("/login/<username>")
def f_username(username):
session[username] = True
print(session)
return "Username %s: Logged In" % username
if __name__ == "__main__":
app.secret_key = b'it_is_a_secret_string'
app.run()
我用不同的URI触发了两个请求,并成功填充了会话cookie:
$ python3 signed_cookie.py
* Serving Flask app "signed_cookie" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
<SecureCookieSession {'steve': True}>
127.0.0.1 - - [11/Oct/2018 17:55:06] "GET /login/steve HTTP/1.1" 200 -
<SecureCookieSession {'linus': True, 'steve': True}>
127.0.0.1 - - [11/Oct/2018 17:55:14] "GET /login/linus HTTP/1.1" 200 -
使用我提到的工具,可以从我的浏览器中解码会话cookie值。
我的问题是:
app.secret_key
签名的,那么如何在没有秘密的情况下解码会话cookie的值? 观察:如果cookie具有一个单键字典,则在使用该工具时,它会报告类似“期望字典”(错误)的信息。这就是为什么我在此示例中执行两个请求的原因,以便向SecureCookieSession
字典添加一个键/值对。