Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 8184

Show
Ignore:
Timestamp:
11/21/07 21:31:45 (1 year ago)
Author:
nzkoz
Message:

Make sure that cookie sessions use a secret that is at least 30 chars in length. [Koz]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack/CHANGELOG

    r8166 r8184  
    11*SVN* 
     2 
     3* Make sure that cookie sessions use a secret that is at least 30 chars in length. [Koz] 
    24 
    35* Fixed that partial rendering should look at the type of the first render to determine its own type if no other clues are available (like when using text.plain.erb as the extension in AM) #10130 [java] 
  • trunk/actionpack/lib/action_controller/session/cookie_store.rb

    r8181 r8184  
    5454 
    5555    # The secret option is required. 
    56     if options['secret'].blank? 
    57       raise ArgumentError, 'A secret is required to generate an integrity hash for cookie session data. Use config.action_controller.session = { :session_key => "_myapp_session", :secret => "some secret phrase" } in config/environment.rb' 
    58     end 
     56    ensure_secret_secure(options['secret']) 
    5957 
    6058    # Keep the session and its secret on hand so we can read and write cookies. 
     
    7775    options['no_hidden'] = true 
    7876    options['no_cookies'] = true 
     77  end 
     78 
     79  # To prevent users from using something insecure like "Password" we make sure that the 
     80  # secret they've provided is at least 30 characters in length. 
     81  def ensure_secret_secure(secret) 
     82    # There's no way we can do this check if they've provided a proc for the 
     83    # secret. 
     84    return true if secret.is_a?(Proc) 
     85 
     86    if secret.blank? 
     87      raise ArgumentError, 'A secret is required to generate an integrity hash for cookie session data. Use config.action_controller.session = { :session_key => "_myapp_session", :secret => "some secret phrase" } in config/environment.rb' 
     88    end 
     89 
     90    if secret.length < 30 
     91      raise ArgumentError, "Secret should be something secure, like #{CGI::Session.generate_unique_id}.  The value you provided: [#{secret}]" 
     92    end 
    7993  end 
    8094 
  • trunk/actionpack/test/controller/session_fixation_test.rb

    r8176 r8184  
    11require File.dirname(__FILE__) + '/../abstract_unit' 
     2 
    23 
    34class SessionFixationTest < Test::Unit::TestCase 
     
    1314 
    1415  class TestController < ActionController::Base 
    15     session :session_key => '_myapp_session_id', :secret => 'secret', :except => :default_session_key 
     16    session :session_key => '_myapp_session_id', :secret => CGI::Session.generate_unique_id, :except => :default_session_key 
    1617    session :cookie_only => false, :only => :allow_session_fixation 
    1718 
  • trunk/actionpack/test/controller/session/cookie_store_test.rb

    r6764 r8184  
    44 
    55require 'stringio' 
     6 
     7 
     8class CGI::Session::CookieStore 
     9  def ensure_secret_secure_with_test_hax(secret) 
     10    if secret == CookieStoreTest.default_session_options['secret'] 
     11      return true 
     12    else 
     13      ensure_secret_secure_without_test_hax(secret) 
     14    end 
     15  end 
     16  alias_method_chain :ensure_secret_secure, :test_hax 
     17end 
     18 
    619 
    720# Expose for tests. 
     
    5063  end 
    5164 
     65  def test_raises_argument_error_if_secret_is_probably_insecure 
     66    ["password", "secret", "12345678901234567890123456789"].each do |blank| 
     67      assert_raise(ArgumentError, blank.inspect) { new_session 'secret' => blank } 
     68    end 
     69  end 
     70 
    5271  def test_reconfigures_session_to_omit_id_cookie_and_hidden_field 
    5372    new_session do |session|