如何在Python的Flask中正确安全地处理cookie和会话?

 大师兄v断水流 发布于 2023-02-13 15:45

在应用程序中,我正在编写此刻我已经在用户浏览器中保存了一个存储了会话ID的cookie,并且该ID被用作对存储在数据库中的会话的引用,该会话包含用户的信息,包括如果用户是正确登录.

我想查看我的解决方案的安全性,我盯着看看我应该如何在登录时设置cookie,在服务器端存储的会话中存储什么以及如何在注销时销毁该信息,因为截至目前我的用户仍在记录多年来,这不是我的意图.

我遇到的问题是如何在Flask中正确处理整个用户登录/会话/注销问题 - 有些人正在谈论使用Flask的Response.delete_cookie()函数,其他人使用.set_cookie()将其终止.到期时间,其他人提到Flask的会话模块,其他的危险模块......

在应该与Flask,代码示例等一起使用的模块方面,最安全,正确和正确的处理方法是什么?

1 个回答
  • 的背景

    方法#1

    处理会话的简单而安全的方法是执行以下操作:

    使用包含会话ID(随机数)的会话cookie.

    使用密钥对会话cookie进行签名(以防止回火 - 这就是它的危险).

    将实际会话数据存储在服务器端的数据库中(按ID索引,或使用NoSQL键/值存储).

    当用户访问您的页面时,您将从数据库中读取数据.

    用户注销时,您将从数据库中删除数据.

    请注意,有一些缺点.

    您需要维护该数据库后端(更多维护)

    您需要为每个请求命中数据库(性能较低)

    方法#2

    另一种选择是将所有数据存储在cookie中,并对所述cookie进行签名(并可选地加密).然而,这种方法也有许多缺点:

    这在后端更容易(维护更少,性能更好).

    您需要小心不要包含用户不应在会话中看到的数据(除非您正在加密).

    您可以在Cookie中保存的数据量有限.

    您不能使单个会话无效(!).

    代码

    Flask实际上已经实现了已签名的会话cookie,因此它实现了方法#2.

    要从#2到#1,你所要做的就是:

    生成随机会话ID(您可以使用os.urandom+ base64).

    将会话数据保存在数据库后端,由会话ID索引(如果您需要Python对象,则使用例如JSON,Picke序列化它,但如果可以的话,请避免使用).

    用户注销时从数据库后端删除会话.

    确保您受到针对会话固定攻击的保护.为此,请确保在用户登录时生成新的会话ID,并且不重用其现有的会话ID.

    此外,请确保在会话上实现过期(只需添加"最后看到的"时间戳).

    您最有可能从Django的实现中获得灵感.

    2023-02-13 15:47 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有