4

我正在编写一个集成测试以确保我的 webapp 不会受到会话固定的影响。

我已经手动验证了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无法按预期工作?我可以做些什么来编写一个验证会话固定不是问题的测试?

4

1 回答 1

0

所以我最终确实弄清楚了这一点。

我试图直接编辑响应标头以测试 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)
于 2011-06-07T19:01:37.807 回答