Rails / RSpec: reset_session ne change pas la valeur Set-Cookie en-tête HTTP lors des tests d'intégration
-
16-10-2019 - |
Question
J'écris un test d'intégration pour vous assurer que mon webapp est pas vulnérable à la fixation de la session.
J'ai vérifié manuellement que reset_session
tire en fait dans la logique d'authentification, et en outre que le cookie ne change en effet quand je me connecte avec mon navigateur web (donc, je ne suis pas vulnérable à la fixation de session plus), mais je peux « t obtenir mon test d'intégration RSpec pour vérifier avec succès ce.
Voici mon test d'intégration RSpec.
require 'spec_helper'
describe "security" do
self.use_transactional_fixtures = false
append_after(:each) do
ALL_MODELS.each &:delete_all
end
describe "session fixation" do
it "should change the cookie session id after logging in" do
u = test_user :active_user => true,
:username => "nobody@example.com",
:password => "asdfasdf"
u.save!
https!
get_via_redirect "/login"
assert_response :success
cookie = response.header["Set-Cookie"].split(";").select{|x| x.match(/_session/)}[0].split("=")[1].strip
post_via_redirect "/login", "user[email]" => "nobody@example.com",
"user[password]" => "asdfasdf",
"user[remember_me]" => "1"
assert_response :success
path.should eql("/dashboard")
cookie.should_not eql(response.header["Set-Cookie"].split(";").select{|x| x.match(/_session/)}[0].split("=")[1].strip)
end
end
end
Tout fonctionne sauf pour la dernière assert. Le cookie ne change pas.
Y a-t-il des problèmes connus avec RSpec / Rails tests d'intégration où reset_session
ne fonctionne pas comme prévu? Que puis-je faire pour écrire un test que la fixation de session est vérifie pas un problème?
La solution
Je finalement ai fini par comprendre cela.
Je tente de modifier l'en-tête de réponse directement aux cookies de test, mais je suppose que ce n'est pas le chemin béni.
Dans les tests d'intégration avec Rails 2.x de toute façon, il y a un hachage de cookies que vous pouvez utiliser. Voici ce que le test a fini par ressembler à:
u = test_user :active_user => true,
:username => "nobody@example.com",
:password => "asdfasdf"
u.save!
https!
get_via_redirect "/login"
assert_response :success
cookie = cookies['_session']
cookie.should be_present
path.should == "/login"
post_via_redirect "/login", "user[email]" => "nobody@example.com",
"user[password]" => "asdfasdf",
"user[remember_me]" => "1"
assert_response :success
path.should eql("/?login_success=1")
new_cookie = cookies['_session']
new_cookie.should be_present
cookie.should_not eql(new_cookie)