【问题标题】:Flask security issue with session and request repeater会话和请求转发器的 Flask 安全问题
【发布时间】:2015-05-03 02:15:23
【问题描述】:

我正在使用 Flask 内置会话机制。

这是我对会话机制的理解(使用烧瓶):

  • 所有会话数据都存储在签名的 cookie 中(使用 app.secret_key)
  • 当会话数据被修改时,cookie被改变
  • 会话的数据受到保护以防止写入客户端(由于签名),但不能防止读取

想象以下场景:

  • 在我的会话中,我放了一个变量try_number=3
  • 用户每执行一次操作,这个数字就会减少一个
  • 如果此数字等于 0,则禁止操作

用户第一次连接应用,应用发送Set-Cookie: sesssion=Flask.sign("try_number=3"),我们称这个cookie为COOKIE_A

用户执行他的第一个动作,他发送COOKIE_A,应用程序回复Set-Cookie: sesssion=Flask.sign("try_number=2"),我们称这个cookie为COOKIE_B

现在,如果用户执行另一个操作,但没有使用COOKIE_B,而是再次使用COOKIE_A(例如使用curl),cookie 仍然是签名的,并且将由服务器处理,使用@ 987654329@.

因此,只有使用COOKIE_A进行所有操作,他才能“欺骗”会话机制,并在同一个会话中进行无限制的操作。

是否有任何内置机制来防止这种情况? (我不是在谈论使用 sqlite / redis 的 sn-p,而是内置解决方案)

【问题讨论】:

    标签: python security session flask


    【解决方案1】:

    这不是 Flask cookie 安全性的失败,而是您的计数器设计的失败。没有针对replay attacks 的内置保护。

    您可以缩短会话 cookie 的过期时间。这并不能真正解决问题,它只会使窗口变小。它还使会话不方便常规使用,这会惹恼您的普通用户。

    最终,您必须在服务器上存储一些信息并对其进行检查。您可以在每个请求中发送一个随机数,并保存已发回的随机数,而忽略以前见过的随机数。您也可以只在服务器端存储所有会话信息(一些识别密钥除外),因此无法重新发送。

    【讨论】:

      猜你喜欢
      • 2017-06-17
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2012-11-21
      • 1970-01-01
      • 2012-08-24
      相关资源
      最近更新 更多