Rails / RSpec: reset_session non cambiare set-cookie HTTP intestazione valore durante i test di integrazione
-
16-10-2019 - |
Domanda
Sto scrivendo un test di integrazione per assicurarsi che il mio webapp non è vulnerabile alla fissazione sessione.
Ho verificato manualmente che reset_session
è in realtà sparare nella logica di autenticazione, e, inoltre, che il cookie effettivamente cambiare quando accedo con il mio browser web (così, io non sono vulnerabili alla fissazione sessione di più), ma posso 't ottenere il mio test di integrazione RSpec con successo verificare questo.
Ecco il mio test di integrazione 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
Tutto funziona tranne per l'ultima asserzione. Il cookie non cambia.
Ci sono problemi noti con RSpec / rotaie test di integrazione in cui reset_session
non funziona come previsto? Che cosa posso fare per scrivere un test che verifica la sessione di fissaggio non è un problema?
Soluzione
Così alla fine ho fatto finire capire questo fuori.
I stava cercando di modificare l'intestazione di risposta direttamente ai cookie di prova, ma credo che non è il modo benedetta.
Nei test di integrazione con Rails 2.x comunque, c'è un hash cookie che è possibile utilizzare. Ecco ciò che il test ha finito per assomigliare:
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)