Rails/RSPEC: Reset_Session ändert sich während der Integrationstests nicht an den HTTP-Header-Wert von Set-Cookie-Header
-
16-10-2019 - |
Frage
Ich schreibe einen Integrationstest, um sicherzustellen, dass mein WebApp nicht anfällig für Sitzungsfixierung ist.
Ich habe das manuell überprüft reset_session
feuert tatsächlich in die Authentifizierungslogik und fördert weiter, dass sich der Cookie tatsächlich ändert, wenn ich mich mit meinem Webbrowser anmelde Überprüfen Sie dies.
Hier ist mein RSPEC -Integrationstest.
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
funktioniert alles außer für die allerletzte Behauptung. Der Keks ändert sich nicht.
Gibt es bekannte Probleme mit RSPEC/Rails -Integrationstests, bei denen reset_session
Funktioniert nicht wie erwartet? Was kann ich tun, um einen Test zu schreiben, bei dem die Fixierung der Sitzung überprüft wird, ist kein Problem?
Lösung
Also habe ich das schließlich herausgefunden.
Ich habe versucht, den Antwortheader direkt zu bearbeiten, um Cookies zu testen, aber ich denke, das ist nicht der gesegnete Weg.
In Integrationstests mit Rails 2.x sowieso gibt es einen Cookies -Hash, den Sie verwenden können. So sah der Test aus:
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)