Rails/rspec: reset_session не изменяет значение заголовка HTTP Set-Cookie во время интеграционных тестов
-
16-10-2019 - |
Вопрос
Я пишу интеграционный тест, чтобы убедиться, что мое веб -приложение не уязвимо для фиксации сеанса.
Я вручную проверил, что reset_session
На самом деле стреляет в логику аутентификации, и, кроме того, что файл cookie действительно меняется, когда я вхожу в систему со своим веб -браузером (так что я больше не уязвим к фиксации сеанса), но я не могу получить свой тест на интеграцию RSPEC до успешного Проверьте это.
Вот мой тест интеграции 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
Все работает кроме Для самого последнего утверждения. Cookie не меняется.
Есть ли известные проблемы с тестами интеграции RSPEC/Rails, где reset_session
не работает, как ожидалось? Что я могу сделать, чтобы написать тест, который проверяет фиксацию сеанса, не является проблемой?
Решение
Так что в конце концов я в конечном итоге выяснил это.
Я пытался отредактировать заголовок ответа непосредственно для тестирования файлов cookie, но я думаю, что это не блаженный путь.
В любом случае, в интеграционных тестах с Rails 2.x есть хэш файлов cookie, который вы можете использовать. Вот как выглядел тест:
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)