FIX: StaticController#enter should not redirect to invalid paths (#27913)

This commit updates `StaticController#enter` to not redirect to invalid
paths when the `redirect` param is set. Instead it should redirect to `/` when the
`redirect` param is invalid.
This commit is contained in:
Alan Guo Xiang Tan
2024-07-15 14:39:37 +08:00
committed by GitHub
parent 5f4dc1042e
commit a3d319ac2f
2 changed files with 11 additions and 3 deletions

View File

@ -133,7 +133,8 @@ class StaticController < ApplicationController
forum_uri = URI(Discourse.base_url) forum_uri = URI(Discourse.base_url)
uri = URI(redirect_location) uri = URI(redirect_location)
if uri.path.present? && (uri.host.blank? || uri.host == forum_uri.host) && uri.path !~ /\./ if uri.path.present? && (uri.host.blank? || uri.host == forum_uri.host) &&
uri.path =~ %r{\A\/{1}[^\.\s]*\z}
destination = "#{uri.path}#{uri.query ? "?#{uri.query}" : ""}" destination = "#{uri.path}#{uri.query ? "?#{uri.query}" : ""}"
end end
rescue URI::Error rescue URI::Error
@ -141,7 +142,7 @@ class StaticController < ApplicationController
end end
end end
redirect_to destination redirect_to(destination, allow_other_host: false)
end end
FAVICON ||= -"favicon" FAVICON ||= -"favicon"

View File

@ -290,7 +290,7 @@ RSpec.describe StaticController do
end end
end end
context "with a full url to someone else" do context "with a full url to an external host" do
it "redirects to the root path" do it "redirects to the root path" do
post "/login.json", params: { redirect: "http://eviltrout.com/foo" } post "/login.json", params: { redirect: "http://eviltrout.com/foo" }
expect(response).to redirect_to("/") expect(response).to redirect_to("/")
@ -320,6 +320,13 @@ RSpec.describe StaticController do
expect(response).to redirect_to("/") expect(response).to redirect_to("/")
end end
end end
context "when the redirect path is invalid" do
it "redirects to the root URL" do
post "/login.json", params: { redirect: "test" }
expect(response).to redirect_to("/")
end
end
end end
describe "#service_worker_asset" do describe "#service_worker_asset" do