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

Changeset 8842

Show
Ignore:
Timestamp:
02/10/08 01:12:44 (7 months ago)
Author:
nzkoz
Message:

2-0-stable: Correct inconsistencies in RequestForgeryProtection docs. References #11032 [mislav]

Merging [8807]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/2-0-stable/actionpack/CHANGELOG

    r8837 r8842  
    11*SVN* 
     2 
     3* Correct inconsistencies in RequestForgeryProtection docs.  #11032 [mislav] 
    24 
    35* Make assert_routing aware of the HTTP method used.  #8039 [mpalmer] 
  • branches/2-0-stable/actionpack/lib/action_controller/request_forgery_protection.rb

    r8350 r8842  
    1414    end 
    1515     
     16    # Protecting controller actions from CSRF attacks by ensuring that all forms are coming from the current web application, not a 
     17    # forged link from another site, is done by embedding a token based on the session (which an attacker wouldn't know) in all 
     18    # forms and Ajax requests generated by Rails and then verifying the authenticity of that token in the controller.  Only 
     19    # HTML/JavaScript requests are checked, so this will not protect your XML API (presumably you'll have a different authentication 
     20    # scheme there anyway).  Also, GET requests are not protected as these should be indempotent anyway. 
     21    # 
     22    # This is turned on with the <tt>protect_from_forgery</tt> method, which will check the token and raise an 
     23    # ActionController::InvalidAuthenticityToken if it doesn't match what was expected. You can customize the error message in 
     24    # production by editing public/422.html.  A call to this method in ApplicationController is generated by default in post-Rails 2.0 
     25    # applications. 
     26    # 
     27    # The token parameter is named <tt>authenticity_token</tt> by default. If you are generating an HTML form manually (without the 
     28    # use of Rails' <tt>form_for</tt>, <tt>form_tag</tt> or other helpers), you have to include a hidden field named like that and 
     29    # set its value to what is returned by <tt>form_authenticity_token</tt>. Same applies to manually constructed Ajax requests. To 
     30    # make the token available through a global variable to scripts on a certain page, you could add something like this to a view: 
     31    # 
     32    #   <%= javascript_tag "window._token = '#{form_authenticity_token}'" %> 
     33    # 
     34    # Request forgery protection is disabled by default in test environment.  If you are upgrading from Rails 1.x, add this to 
     35    # config/environments/test.rb: 
     36    # 
     37    #   # Disable request forgery protection in test environment 
     38    #   config.action_controller.allow_forgery_protection = false 
     39    # 
     40    # == Learn more about CSRF (Cross-Site Request Forgery) attacks 
     41    # 
     42    # Here are some resources: 
     43    # * http://isc.sans.org/diary.html?storyid=1750 
     44    # * http://en.wikipedia.org/wiki/Cross-site_request_forgery 
     45    # 
     46    # Keep in mind, this is NOT a silver-bullet, plug 'n' play, warm security blanket for your rails application. 
     47    # There are a few guidelines you should follow: 
     48    # 
     49    # * Keep your GET requests safe and idempotent.  More reading material: 
     50    #   * http://www.xml.com/pub/a/2002/04/24/deviant.html 
     51    #   * http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 
     52    # * Make sure the session cookies that Rails creates are non-persistent.  Check in Firefox and look for "Expires: at end of session" 
     53    # 
    1654    module ClassMethods 
    17       # Protect a controller's actions from CSRF attacks by ensuring that all forms are coming from the current web application, not  
    18       # a forged link from another site. This is done by embedding a token based on the session (which an attacker wouldn't know) in  
    19       # all forms and Ajax requests generated by Rails and then verifying the authenticity of that token in the controller. Only 
    20       # HTML/JavaScript requests are checked, so this will not protect your XML API (presumably you'll have a different authentication 
    21       # scheme there anyway). Also, GET requests are not protected as these should be indempotent anyway. 
    22       # 
    23       # You turn this on with the #protect_from_forgery method, which will perform the check and raise  
    24       # an ActionController::InvalidAuthenticityToken if the token doesn't match what was expected. And it will add  
    25       # a _authenticity_token parameter to all forms that are automatically generated by Rails. You can customize the error message  
    26       # given through public/422.html. 
    27       # 
    28       # Learn more about CSRF (Cross-Site Request Forgery) attacks: 
    29       # 
    30       # * http://isc.sans.org/diary.html?storyid=1750 
    31       # * http://en.wikipedia.org/wiki/Cross-site_request_forgery 
    32       # 
    33       # Keep in mind, this is NOT a silver-bullet, plug 'n' play, warm security blanket for your rails application. 
    34       # There are a few guidelines you should follow: 
    35       #  
    36       # * Keep your GET requests safe and idempotent.  More reading material: 
    37       #   * http://www.xml.com/pub/a/2002/04/24/deviant.html 
    38       #   * http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 
    39       # * Make sure the session cookies that Rails creates are non-persistent.  Check in Firefox and look for "Expires: at end of session" 
    40       # 
    41       # If you need to construct a request yourself, but still want to take advantage of forgery protection, you can grab the  
    42       # authenticity_token using the form_authenticity_token helper method and make it part of the parameters yourself. 
     55      # Turn on request forgery protection. Bear in mind that only non-GET, HTML/JavaScript requests are checked. 
    4356      # 
    4457      # Example: 
     
    5568      #   end 
    5669      # 
    57       # If you are upgrading from Rails 1.x, disable forgery protection to 
    58       # simplify your tests. Add this to config/environments/test.rb: 
    59       # 
    60       #   # Disable request forgery protection in test environment 
    61       #   config.action_controller.allow_forgery_protection = false 
    62       # 
    6370      # Valid Options: 
    6471      # 
    65       # * <tt>:only/:except</tt> - passed to the before_filter call.  Set which actions are verified. 
    66       # * <tt>:secret</tt> - Custom salt used to generate the form_authenticity_token
     72      # * <tt>:only/:except</tt> - passed to the <tt>before_filter</tt> call.  Set which actions are verified. 
     73      # * <tt>:secret</tt> - Custom salt used to generate the <tt>form_authenticity_token</tt>
    6774      #   Leave this off if you are using the cookie session store. 
    6875      # * <tt>:digest</tt> - Message digest used for hashing.  Defaults to 'SHA1'