4

Webアプリがセッション固定に対して脆弱でないことを確認するために統合テストを作成しています。

認証ロジックで実際に起動していることを手動で確認しreset_sessionました。さらに、Webブラウザでログインすると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

最後のアサートを除いて、すべてが機能します。クッキーは変更されません。

RSpec / Rails統合テストでreset_session期待どおりに機能しない既知の問題はありますか?セッション固定が問題ではないことを確認するテストを作成するにはどうすればよいですか?

4

1 に答える 1

0

だから私は結局これを理解することになった。

応答ヘッダーを直接編集してCookieをテストしようとしましたが、それは幸いな方法ではないと思います。

とにかくRails2.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 に答える