SESSION_COOKIE_SECURE 不加密会话
Posted
技术标签:
【中文标题】SESSION_COOKIE_SECURE 不加密会话【英文标题】:SESSION_COOKIE_SECURE does not encrypt session 【发布时间】:2019-02-28 04:59:58 【问题描述】:我正在尝试为我的 Flask 网络应用程序设置一些安全性。作为第一步,我将通过将 SESSION_COOKIE_SECURE
设置为 true 来确保会话 cookie 的安全。
但是在我从“检查元素”中获取会话 cookie 后,我可以轻松解码会话 cookie,并且添加 SESSION_COOKIE_SECURE
没有区别。
这是我的代码:
from flask import Flask, request, app, render_template, session, send_file, redirect
MyApp = Flask(__name__)
MyApp.secret_key = "something"
application = MyApp
if __name__ == "__main__":
MyApp.debug = False
MyApp.config.update(
SESSION_COOKIE_SECURE=True,
SESSION_COOKIE_HTTPONLY=True,
SESSION_COOKIE_SAMESITE='Lax',
)
MyApp.config["SESSION_PERMANENT"] = True
MyApp.run()
我也尝试使用以下语法添加此属性,但这没有任何区别:
MyApp.config['SESSION_COOKIE_SECURE'] = True
当我尝试打印 SESSION_COOKIE_SECURE
时出现此错误
Traceback (most recent call last):
File "...", line ..., in <module>
print(MyApp.session_cookie_secure)
AttributeError: 'Flask' object has no attribute 'session_cookie_secure'
我的 Flask 版本是 1.0.2,我使用的是 HTTPS。
【问题讨论】:
【参考方案1】:设置SESSION_COOKIE_SECURE
不会加密cookie 值,不会。设置后,这会导致 Flask 使用 "Secure" flag set 创建 cookie。这意味着浏览器只能通过加密的连接将cookie返回给服务器,仅此而已。该设置不会改变 cookie 值本身的任何内容。
Flask 默认生成经过加密签名的 cookie。这意味着 cookie 内容可以被解码但不能更改,因为无法访问服务器机密的第三方无法为 cookie 创建有效签名。
如果您 a) 使用 HTTPS(加密来自外部的数据)并且 b) 保护您的 Web 应用程序免受 XSS 攻击,您通常不需要需要加密您的会话 cookie。如果没有 XSS 攻击向量,攻击者无论如何都无法访问您的 cookie 内容。
您当然不需要在这里这样做,因为SESSION_COOKIE_HTTPONLY
意味着浏览器永远不会将 cookie 暴露给 javascript,只有对浏览器具有完全访问权限的人才能看到 cookie 值。
Flask 没有“加密 cookie”设置,因为当您可以通过其他方式保护 cookie 时,认为没有必要。您不应将信息存储在会话 cookie 中,如此敏感,以至于最终用户无法访问浏览器存储;将此类数据保存在服务器上,并仅在会话中存储唯一标识符,以便稍后检索该秘密数据。
如果由于某种原因您无法将此类秘密保留在会话 cookie 之外,并且不愿意接受最终用户可以读取此数据,那么您必须自己加密 cookie 或使用替代会话提供程序对于 Flask,例如 EncryptedSession
。
关于属性错误:只有少数配置设置可以作为Flask
对象上的属性访问。要打印任意配置设置,请使用app.config
对象:
print(MyApp.config['SESSION_COOKIE_SECURE'])
【讨论】:
我如何加密我的会话? @K327:你认为你为什么需要这样做? 阻止用户查看 cookie 内容 @K327: 当然可以,但是为什么 cookie 中有用户不能看到的数据? 我已将用户角色置于会话中,但正如您所说,用户无法更改它。我得到我的答案谢谢男人以上是关于SESSION_COOKIE_SECURE 不加密会话的主要内容,如果未能解决你的问题,请参考以下文章
Flask——The CSRF tokens do not match.