DEV - handle malformed `page` param (#11093)

* DEV - handle malformed page params
This commit is contained in:
jbrw 2020-11-02 12:40:54 -05:00 committed by GitHub
parent 03cd5baed9
commit 9ff7f25106
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 3 deletions

View File

@ -11,7 +11,8 @@ class SearchController < ApplicationController
end
def show
@search_term = params.permit(:q)[:q]
permitted_params = params.permit(:q, :page)
@search_term = permitted_params[:q]
# a q param has been given but it's not in the correct format
# eg: ?q[foo]=bar
@ -28,6 +29,12 @@ class SearchController < ApplicationController
raise Discourse::InvalidParameters.new("string contains null byte")
end
page = permitted_params[:page]
# check for a malformed page parameter
if page && (!page.is_a?(String) || page.to_i.to_s != page)
raise Discourse::InvalidParameters
end
rate_limit_errors = rate_limit_search
discourse_expires_in 1.minute
@ -36,8 +43,8 @@ class SearchController < ApplicationController
type_filter: 'topic',
guardian: guardian,
blurb_length: 300,
page: if params[:page].to_i <= 10
[params[:page].to_i, 1].max
page: if page.to_i <= 10
[page.to_i, 1].max
end
}

View File

@ -330,6 +330,21 @@ describe SearchController do
expect(response.status).to eq(400)
end
it "doesn't raise an error if the page is a string number" do
get "/search.json", params: { q: 'kittens', page: '3' }
expect(response.status).to eq(200)
end
it "doesn't raise an error if the page is a integer number" do
get "/search.json", params: { q: 'kittens', page: 3 }
expect(response.status).to eq(200)
end
it "returns a 400 error if the page parameter is invalid" do
get "/search.json?page=xawesome%27\"</a\&"
expect(response.status).to eq(400)
end
it "logs the search term" do
SiteSetting.log_search_queries = true
get "/search.json", params: { q: 'bantha' }