Rails / RSpec: reset_session non cambiare set-cookie HTTP intestazione valore durante i test di integrazione

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

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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top