2013-10-07 8 views
8

私は本当にアイデアのように。誰かがクッキーを盗む場合は、クッキーの署名が期限切れとクッキーの有効期限されていないので、彼/彼女は永続的にサイトにアクセスするためにそれを使用することができ、誰かがそれを盗まれた場合、それはクッキーを再利用してから停止しないため、ここでは役立ちません。より良い方法

私はクッキーの署名が転がると期限切れになるので、ユーザはまだサイトを使用している場合は、タイムスタンプを更新するために、1時間ごと5分後にセッションを期限切れにタイムスタンプを追加しました。

私はScalaのプレイフレームワークにはかなり新しいので、任意の提案や同じことを達成するためのより良い方法がはるかに高く評価されるだろうと思います。すべての5分生産

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 
      } 
     } 
    ) 
    } 
    } 
} 

クッキー:

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

プレイは、セッションクッキーを暗号化し、それで有効期限のタイムスタンプを含めても安全です。あなたはそれを正しくやっている、サーバー側のセッションの必要はありません。 – lambdas

+0

同じことをやろうと思っていますが、これに欠陥があります。 f(ユーザ)(要求)コールが既にセッションを変更した場合はどうなりますか?この場合、リクエストのセッションを変更のベースとして使用すると、その変更が緩んでいますか? – agabor

+0

私はちょうど興味があります:なぜあなたは "ロールオーバー"機能が必要でしょうか?認証されたリクエストごとにタイムスタンプを更新するだけでは十分ではないでしょうか? – Martin

答えて

2

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