解码Flask会话cookie

时间:2018-10-11 23:06:26

标签: session cookies flask

根据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值。

我的问题是:

  • 如果cookie是由app.secret_key签名的,那么如何在没有秘密的情况下解码会话cookie的值?
  • 会话cookie值是否像某种盐值一样存储了秘密?

观察:如果cookie具有一个单键字典,则在使用该工具时,它会报告类似“期望字典”(错误)的信息。这就是为什么我在此示例中执行两个请求的原因,以便向SecureCookieSession字典添加一个键/值对。

0 个答案:

没有答案