我正在尝试编写一个基本的Flask应用程序来限制用户可以拥有的活动登录数量,即Netflix。我现在正在使用以下策略:
active_login_count
课程存储User
字段。active_login_count
增加1.如果这样做会使计数超过限制,则会调用logout_user()
。这是一个糟糕的解决方案,因为如果用户丢失了会话(关闭了隐身模式而没有注销),该应用程序无法减少其登录次数,因此,将来的登录将被阻止。
一种解决方案是将会话存储在服务器上,但我不知道如何对有效会话进行身份验证。我正在研究Flask_Sessions,但我不知道如何限制活动会话的数量。
根据我的理解,在默认配置中,Flask会在每个请求上生成新的会话cookie,以防止CSRF攻击。我该怎么做呢?
答案 0 :(得分:0)
解决这个问题可能有几种方法,但没有一种方法在简单性和有效性之间取得很好的平衡:
一种方法是向您的用户添加一个last_seen
字段。选择一些可以用作启发式的数字,以确定某人是否“活跃”。活动中任何足够长的间隔都可能触发active_login_count
的重置。这显然有很多明显的漏洞,我目前看到的最大漏洞是,用户可以简单地协调登录并潜在地增加无限数量的活动会话,而您的应用程序则不那么明智。通常,人们倾向于使用类似的“逻辑”机制来维持自己的一生,这是一种耻辱。但我离题了...
通过尝试跟踪用户的活动IP地址,可以使此方法更加复杂。添加一个active_ips
字段并填充(n)个ip列表,也许还带有一些浏览器信息等,以尝试对用户的设备进行指纹识别并以此方式进行管理。
另一种方法是使用外部服务,例如Redis实例,甚至是数据库。最多创建(n)个会话ID,这些ID在HTTP标头中传递,并且每次点击api时都会进行检查。没有有效的会话ID,或者如果下一个会话ID构成违约,则无法访问该应用。然后,您只需定期清除这些会话ID,以使其保持最新状态即可。
希望能给您一些有用的想法。