2013-07-05 9 views
25

私はRails 3.2からRails 4に切り替えました。私は、セキュリティ上の問題でできるだけ早くスピードアップしていることを確認しようとしています。今はセッションが心配です。 Rails 4はCookieベースのセッションを除いて本当に何かをサポートしなくなったようですが、Cookieベースのセッションが永遠に生き残ることはできないようです。私はいくつかの記事を読んできましたが、これは最も公式です:http://guides.rubyonrails.org/security.html#session-expiry。クッキーベースのセッションではこれが問題であると指摘していますが、データベースベースのセッション(これは廃止されているはずです)のために修正されています。Rails 4:セッションが終了しましたか?

私は本当に混乱しています。私は、攻撃者がログイン保護されたサイトに永久にアクセスできるクッキーを取得できないようにしたい。明らかに私は:initializers/session_store.rbでexpire_afterを設定することができますが、私が間違っていない限り、単にクライアント側のクッキーの有効期限を設定し、攻撃者によって簡単に変更されるので、セッションは永遠に生きることができます。もちろん、SSLを強制したり、安全なCookieを使用したり、HTTPのみを強制したりすることで、より良いものにすることができますが、セッションの有効期限を守るまで完全な防衛になることはありません。

Railsがサーバー側のセッションを持つ唯一の方法を非難している場合、この問題をどのように解決できますか?

私は、アクティブなレコードセッションが宝石に移動され、まだ利用可能であることを知っていますが、それは廃止されているという事実が残っています。より多くの依存関係を導入することなく、あるいは最低限、非推奨機能を使用せずに、ソリューションを実現する必要があります。

+0

なぜ尋ねられてから数年後に(コメントなしで)これが下降していますか? – Kyle

+0

これは非常に有効な質問です.Railsガイドは...まあまあです。最新の「エッジ」であっても、あなたがまだそこにあるものによって混乱した理由を完全に理解しているので、私はあなたの質問に対する良い答えを知ってうれしいです。 – silverdr

答えて

34

Railsには「改ざん防止」セッションCookieがあります。セッションハッシュ改ざんを防止するために、ダイジェストは、サーバーサイドの秘密とのセッションから計算され、Cookieの最後に挿入されます。あなたが長い秘密を持っていることを確認してください。すべてのユーザーセッションを定期的にリセットする場合は、秘密情報を変更します。

あなたが行うことができ、セッションデータに追加のタイムアウトを追加したい場合は、あなたの質問に答えるために:

session[:user_id] = user.id 
session[:expires_at] = Time.current + 24.hours 

を次に、ユーザを認証するとき、ん:

if session[:expires_at] < Time.current 
    # sign out user 
end 

・ホープそれは助ける。

+4

このソリューションは、デフォルトではRails 4.1以降。 Timeオブジェクトは文字列として保存されるように、CookieシリアライザのデフォルトはJSONに変更されました。 – Chewi

+3

'session [:expires_at] .to_time

+0

おそらく、より典型的な使用は、元の有効期限が過ぎたために突然どこからでもなく、あらかじめ選択された非アクティブ期間後にセッションを終了することでしょう。しかし、これはそのようなユースケースを(明示的に)カバーしているようには見えない。ログイン・アクションの一部としてではなく、2番目の行を 'before_action'行としてApplication Controllerに置くと、問題が解決されます。 – silverdr

32

実際には、レールはRack::Session::Cookieから継承されます。 session_store.rbexpire_afterパラメータを設定することができます。

Sqore::Application.config.session_store(
    :cookie_store, 
    key: '_name_session', 
    expire_after: 24.hours 
) 
+1

これは良い答えであり、選択する必要があります –

+4

いいえ、ポスターは明示的にクライアント側で改ざんされる可能性があるため、これをしたくないと述べました。 – Chewi

+0

偉大な答え。 http://api.rubyonrails.org/classes/ActionDispatch/Session/CookieStore.html – dontangg

1

アプリケーションコントローラにこれを追加します。 before_filter:session_expires、:[:ログイン、:ログアウト] before_filter:update_session_time、:=>を除く[:ログイン、:ログアウト]

def session_expires 
@time_left = (session[:expires_at] - Time.now).to_i 
unless @time_left > 0 
reset_session 
flash[:error] = 'Lorem Ipsum.' 
redirect_to :controller => 'foo', :action => 'bar' 
end 
end 

def update_session_time 
    session[:expires_at] = 60.minutes.from_now 
end 
=>を除くと
関連する問題