Rieles / RSpec: reset_session no cambiar Set-Cookie cabecera HTTP valor durante las pruebas de integración
-
16-10-2019 - |
Pregunta
Estoy escribiendo una prueba de integración para asegurarse de que mi aplicación web no es vulnerable a la fijación de sesión.
He verificado manualmente que es en realidad reset_session
disparo en la lógica de autenticación, y, además, que la cookie en efecto, cambiar al iniciar sesión con mi navegador web (así, yo no soy vulnerable a la fijación de sesión ya no), pero puedo 't conseguir mi prueba de integración con éxito a RSpec verificar esto.
Aquí está mi prueba de integración 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
Todo funciona excepto para la última aserción. La cookie no cambia.
¿Hay problemas conocidos con RSpec / carriles pruebas de integración, donde reset_session
no funciona como se espera? ¿Qué puedo hacer yo para escribir una prueba que verifica la fijación de sesión no es un problema?
Solución
Así que, finalmente, no terminan calcular esto.
Yo estaba tratando de editar la cabecera de respuesta directa a las cookies de prueba, pero supongo que eso no es la forma bendita.
En las pruebas de integración con los carriles 2.x todos modos, hay un hash cookies que se pueden utilizar. Esto es lo que la prueba terminó pareciéndose a:
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)