8

セッション データをユーザーのブラウザに保持するというアイデアは本当に気に入っていますが、セッション Cookie が Play フレームワークであまり安全ではないという事実は気に入りません。誰かが 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 分ごとに生成される Cookie:

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

1 に答える 1

2

私には合理的だと思われますが、おそらくサーバー側に置き、クライアントに「セッションID」を与え、ユーザーがログアウトしたときにセッションを削除します。すべてクライアント側で行うということは、セッションが盗まれた場合、タイムアウトを待つ以外にセッションを無効にする方法がないことを意味します。

于 2013-10-08T12:18:49.540 に答える