2010-12-08 20 views
1

Nous avons une application Rails qui communique avec une application iPhone basée sur PhoneGap. Nous sommes en train de mettre à jour l'application Rails de Rails 2.3.5 vers 3. En raison de certains problèmes de compatibilité de PhoneGap avec les cookies de Rails, l'application Rails (pré-mise à niveau) a été configurée avec :cookie_only sur false:Désactivation: cookie_only dans le magasin de sessions dans Rails 3?

ActionController::Base.session = { 
    :key => '_our_key', 
    :secret => 'ourreallyreallylongsecret', 
    :cookie_only => false 
} 

Cette configuration a été traduit à ce qui suit pour Rails 3:

OurApp::Application.config.session_store :cookie_store, :key => '_our_key' 
OurApp::Application.config.secret_token = 'ourreallyreallylongsecret' 

le problème est, je ne peux pas comprendre comment utiliser l'option :cookie_only dans Rails 3. maintenant, je me rends compte que la mise :cookie_only false est une très mauvaise idée et conduit à de mauvais exploits de fixation de session. Nous prévoyons certainement de régler cela à l'avenir. Cependant, l'application iPhone existante repose sur ce comportement afin de fonctionner du tout. Je dois donc pouvoir faire fonctionner l'application iPhone à court terme pendant que nous révisons la session de l'application iPhone.

regardant la source Rails pour CookieStore, on dirait qu'ils ne vraiment veulent pas que nous soyons en mesure d'utiliser cette option plus:

def initialize(app, options = {}) 
    super(app, options.merge!(:cookie_only => true)) 
    freeze 
end 

singe Nous patché les sources Rails de fusion dans :cookie_only => false, qui n'a pas fonctionné. Nous sommes même allés jusqu'à définir directement @cookie_only = false dans la méthode initilize de AbstractStore, mais cela a été simplement ignoré. Il semble que la mise en œuvre CookieStore ne honore plus @cookie_only.

N'y a-t-il vraiment aucun moyen d'utiliser cette fonctionnalité dans Rails 3? Toute aide serait grandement appréciée.

+0

et me voilà tout prêt à sonner avec une description des attaques de fixation de session. bonne chance mec, désolé je ne peux pas aider –

Répondre

0

Si quelqu'un d'autre est le même bateau que moi, il semble qu'il est impossible d'utiliser l'option :cookie_only dans Rails 3 sans modification sérieuse du code Rails lui-même. Et avec raison, car l'utiliser est vraiment une mauvaise idée du point de vue de la sécurité.

Si vous aussi des problèmes avec l'utilisation des cookies dans PhoneGap sur l'iPhone, jetez un oeil à cette question, il a résolu notre problème et évité la nécessité pour les :cookie_only Options: phonegap: cookie based authentication (PHP) not working [webview]

0

Il est extrêmement facile à faire et ne nécessite pas de ragréage ou de modification sur le code Rails, vous avez juste besoin d'un initialiseur avec:

Rails.application.config.session_store :active_record_store, cookie_only: false 

note: J'utilise active_record_store pour le stockage de la session, mais vous utilisez peut-être la valeur par défaut cookies_store ou toute autre chose, adaptez à votre avoir besoin.

Redémarrez le serveur, ouvrez un autre navigateur, assurez-vous qu'il n'y a pas cookie sur cet autre navigateur, et vous pouvez accéder à http://your.server/protected/path?session_key=valid_session_id

Gardez à l'esprit que, selon la façon dont vous utilisez ce mécanisme, il pourrait en fait un peu plus simple pour quelqu'un de voler un ID de session à un autre utilisateur. Mais si vous l'utilisez à bon escient, ce n'est pas différent de porter le session_in dans un cookie.

Codebase: rack :: Session :: Résumé :: ID # extract_session_id https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb#L272