通过cookie实现更安全的Play Scala框架会话的更好方法

时间:2013-10-07 21:23:36

标签: scala playframework-2.0

我非常喜欢在用户浏览器上保留会话数据的想法,但不喜欢会话cookie在播放框架中不是很安全的事实。如果有人窃取了cookie,他/她可以使用它来永久访问该网站,因为cookie签名没有到期,并且cookie过期对此没有帮助,因为如果有人偷了它,它不会停止重用cookie。

如果用户仍在使用网站,我已添加时间戳以在1小时后每隔5分钟使会话到期以更新时间戳,以便cookie签名滚动并过期。

我对scala和play框架都很陌生,所以任何建议或更好的方法来实现这一点都会非常感激。

trait Secured {
  def withAuth(f: => String => Request[AnyContent] => Result) = {
    Security.Authenticated(username, onUnauthorized) { user =>
        Action(request => {

          val sessionRolloverPeriod = 300
          val sessionExpiryTime = 3600
          val sessionCreationTime: Int = request.session("ts").toInt
          val currentTime = System.currentTimeMillis() / 1000L

          if(currentTime <= (sessionCreationTime + sessionExpiryTime)) {
            if(currentTime >= (sessionCreationTime + sessionRolloverPeriod)) {
              f(user)(request).withSession(request.session + ("ts" -> (System.currentTimeMillis() / 1000L).toString))
            } else {
              f(user)(request)
            }
          } else {
            Results.Redirect(routes.Auth.login()).withNewSession
          }
        }
      )
    }
  }
}

每5分钟制作一次饼干:

The cookies produced every 5min: 
Cookie:PS="a6bdf9df798c24a8836c2b2222ec1ea4a4251f301-username=admin&ts=1381180064"
Cookie:PS="D7edg7df709b54B1537c2b9862dc2eaff40001c90-username=admin&ts=1381180380"

1 个答案:

答案 0 :(得分:2)

对我来说似乎很合理,我可能会把它放在服务器端,给客户端一个“session-id”并在用户注销时删除会话。在客户端进行操作意味着除非等待超时,否则无法使会话失效。