Skip to content

Commit d5a4095

Browse files
NZKoztenderlove
authored andcommitted
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
1 parent 78790e4 commit d5a4095

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

actionpack/lib/action_dispatch/http/request.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -228,13 +228,13 @@ def session_options=(options)
228228

229229
# Override Rack's GET method to support indifferent access
230230
def GET
231-
@env["action_dispatch.request.query_parameters"] ||= (normalize_parameters(super) || {})
231+
@env["action_dispatch.request.query_parameters"] ||= deep_munge(normalize_parameters(super) || {})
232232
end
233233
alias :query_parameters :GET
234234

235235
# Override Rack's POST method to support indifferent access
236236
def POST
237-
@env["action_dispatch.request.request_parameters"] ||= (normalize_parameters(super) || {})
237+
@env["action_dispatch.request.request_parameters"] ||= deep_munge(normalize_parameters(super) || {})
238238
end
239239
alias :request_parameters :POST
240240

actionpack/test/dispatch/request/query_string_parsing_test.rb

+15
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ def parse
1111
head :ok
1212
end
1313
end
14+
class EarlyParse
15+
def initialize(app)
16+
@app = app
17+
end
18+
19+
def call(env)
20+
# Trigger a Rack parse so that env caches the query params
21+
Rack::Request.new(env).params
22+
@app.call(env)
23+
end
24+
end
1425

1526
def teardown
1627
TestController.last_query_parameters = nil
@@ -120,6 +131,10 @@ def assert_parses(expected, actual)
120131
set.draw do
121132
match ':action', :to => ::QueryStringParsingTest::TestController
122133
end
134+
@app = self.class.build_app(set) do |middleware|
135+
middleware.use(EarlyParse)
136+
end
137+
123138

124139
get "/parse", actual
125140
assert_response :ok

0 commit comments

Comments
 (0)