mirror of
https://github.com/github/rails.git
synced 2026-01-09 14:48:01 -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 Conflicts: actionpack/lib/action_dispatch/http/request.rb
This commit is contained in:
committed by
Aaron Patterson
parent
78790e4bce
commit
d5a4095ca5
@@ -228,13 +228,13 @@ module ActionDispatch
|
||||
|
||||
# Override Rack's GET method to support indifferent access
|
||||
def GET
|
||||
@env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
|
||||
@env["action_dispatch.request.query_parameters"] ||= deep_munge(normalize_parameters(super) || {})
|
||||
end
|
||||
alias :query_parameters :GET
|
||||
|
||||
# Override Rack's POST method to support indifferent access
|
||||
def POST
|
||||
@env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
|
||||
@env["action_dispatch.request.request_parameters"] ||= deep_munge(normalize_parameters(super) || {})
|
||||
end
|
||||
alias :request_parameters :POST
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -120,6 +131,10 @@ class QueryStringParsingTest < ActionDispatch::IntegrationTest
|
||||
set.draw do
|
||||
match ':action', :to => ::QueryStringParsingTest::TestController
|
||||
end
|
||||
@app = self.class.build_app(set) do |middleware|
|
||||
middleware.use(EarlyParse)
|
||||
end
|
||||
|
||||
|
||||
get "/parse", actual
|
||||
assert_response :ok
|
||||
|
||||
Reference in New Issue
Block a user