mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Deep Munge the parameters for GET and POST
The previous implementation of this functionality could be accidentally subverted by instantiating a raw Rack::Request before the first Rails::Request was constructed. Fixes CVE-2013-6417
This commit is contained in:
parent
0c7ac34aed
commit
4e9dd5378b
2 changed files with 17 additions and 2 deletions
|
@ -271,7 +271,7 @@ module ActionDispatch
|
|||
|
||||
# Override Rack's GET method to support indifferent access
|
||||
def GET
|
||||
@env["action_dispatch.request.query_parameters"] ||= (normalize_encode_params(super) || {})
|
||||
@env["action_dispatch.request.query_parameters"] ||= deep_munge((normalize_encode_params(super) || {}))
|
||||
rescue TypeError => e
|
||||
raise ActionController::BadRequest.new(:query, e)
|
||||
end
|
||||
|
@ -279,7 +279,7 @@ module ActionDispatch
|
|||
|
||||
# Override Rack's POST method to support indifferent access
|
||||
def POST
|
||||
@env["action_dispatch.request.request_parameters"] ||= (normalize_encode_params(super) || {})
|
||||
@env["action_dispatch.request.request_parameters"] ||= deep_munge((normalize_encode_params(super) || {}))
|
||||
rescue TypeError => e
|
||||
raise ActionController::BadRequest.new(:request, e)
|
||||
end
|
||||
|
|
|
@ -11,6 +11,17 @@ class QueryStringParsingTest < ActionDispatch::IntegrationTest
|
|||
head :ok
|
||||
end
|
||||
end
|
||||
class EarlyParse
|
||||
def initialize(app)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
# Trigger a Rack parse so that env caches the query params
|
||||
Rack::Request.new(env).params
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
|
||||
def teardown
|
||||
TestController.last_query_parameters = nil
|
||||
|
@ -131,6 +142,10 @@ class QueryStringParsingTest < ActionDispatch::IntegrationTest
|
|||
set.draw do
|
||||
get ':action', :to => ::QueryStringParsingTest::TestController
|
||||
end
|
||||
@app = self.class.build_app(set) do |middleware|
|
||||
middleware.use(EarlyParse)
|
||||
end
|
||||
|
||||
|
||||
get "/parse", actual
|
||||
assert_response :ok
|
||||
|
|
Loading…
Reference in a new issue