2008-09-28 14 views
10

J'utilise la version actuelle de restful_authentication que l'on trouve sur github et j'ai un tas de problèmes de session étranges. Le serveur semble attribuer des sessions aux utilisateurs, ce qui ne devrait pas être le cas. Cela se produit uniquement lorsque vous traversez la barrière déconnectée/connectée.Problème de détournement de session par inadvertance avec authentification reposée

Voici un exemple. Si aucune session n'est active sur le serveur, je me connecte à un compte avec l'utilisateur A. Sur une autre machine, je me connecte avec l'utilisateur B. Puis, lorsque je déconnecte l'utilisateur B, quelque temps après la redirection de déconnexion, je suis connecté utilisateur A. A partir de ce point, je peux continuer à naviguer sur le site comme si je m'étais connecté en tant qu'utilisateur! Quelque chose que j'ai observé via les journaux est que lorsque ce détournement se produit, les ID de session ne sont pas les mêmes. L'utilisateur A est connecté dans les deux sessions, mais les ID de session sont complètement différents. Ce n'est qu'un exemple de ce qui pourrait arriver. Je ne peux pas reproduire le problème de manière fiable, car il semble aléatoire.

Cela ne semble pas être un symptôme de l'environnement ou du serveur sur lequel il s'exécute. Je peux reproduire le problème en utilisant à la fois le bâtard et le passager. Je l'ai aussi vu dans le développement et la production. J'utilise des sessions basées sur DB dans cette application et il fonctionne sur Rails 2.1.1. J'ai appliqué l'option stateful lors de l'appel du générateur. Sinon, aucune autre modification n'a été apportée à la façon dont les sessions sont traitées.

Mise à jour Voici la méthode incriminée qui provient directement de restful_authentication.

# Accesses the current user from the session. 
# Future calls avoid the database because nil is not equal to false. 
def current_user 
    @current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false 
end 

Répondre

2

Je ne sais pas si c'est une bonne réponse car c'est un travail. Tout ce que j'ai fait, c'est passer à des sessions basées sur les cookies et tout fonctionne bien.

3

Cela peut se produire si vous (ou ceux qui ont écrit restful_authentication) mettez en cache l'utilisateur actuel dans une variable de classe. J'ai vu un tas d'articles prônant l'utilisation de "User.current_user", mais comme les classes sont mises en cache à travers les demandes, cela peut provoquer des altérations de session.

+0

Cela semble être une réponse plausible, mais j'ai quand même réussi à reproduire ce comportement de piratage après avoir supprimé le stockage de l'objet current_user du stockage dans une variable de cache. – Jared

+0

Si vous cachez l'utilisateur actuel dans une variable de classe, vous devez juste vous rappeler de le nettoyer avant chaque requête. Quelque chose comme: 'before filter: clean_user; before_filter: authenticate' – Arsen7

0

Ce site est-il distant? Vous connectez-vous sur deux ordinateurs distincts sur le même réseau?

+0

Je l'ai en cours d'exécution localement en développement sur mon ordinateur portable et en production sur mon serveur. Vous avez raison sur les 2 comptes sur le même réseau. Je le fais dans des navigateurs séparés sur des machines séparées cependant. – Jared