Rails / RSpec: reset_session ne change pas la valeur Set-Cookie en-tête HTTP lors des tests d'intégration

StackOverflow https://stackoverflow.com/questions/4764126

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?

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top