Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CAPT-1953 - Initial attempt to silence repeated unwanted requests #3464

Merged
merged 1 commit into from
Dec 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ class ApplicationController < ActionController::Base

helper_method :timeout_warning_in_minutes

def handle_unwanted_requests
render file: Rails.root.join("public", "404.html"), status: :not_found, layout: false
end

private

def timeout_warning_in_minutes
Expand Down
25 changes: 25 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,29 @@ def matches?(request)
end
end
end

# We still want to know about 404s in case of missing a route, but silence a whitelist instead to reduce the noise in Rollbar
# This is not exhastive, so add more if there are obvious requests to ignore

# 404 - extensions we don't expect
match "*path", to: "application#handle_unwanted_requests", via: :all, constraints: lambda { |req|
req.path =~ %r{\.(axd|asp|aspx|cgi|htm|html|php|php7|pl|txt|xml)$}i
}

# 404 - folders
match "*path", to: "application#handle_unwanted_requests", via: :all, constraints: lambda { |req|
req.path =~ %r{^/\.git/config$}i ||
req.path =~ %r{^/cgi-bin}i ||
req.path =~ %r{^/webui}i
}

# 404 - hard-coded apple icons - gov uk seems to 404 these as well
match "*path", to: "application#handle_unwanted_requests", via: :all, constraints: lambda { |req|
req.path =~ %r{^/apple-touch-icon(-120x120)?(-precomposed)?\.png$}i
}

# 404 - wordpress
match "*path", to: "application#handle_unwanted_requests", via: :all, constraints: lambda { |req|
req.path =~ %r{^/(wordpress|wp)}i
}
end
51 changes: 51 additions & 0 deletions spec/routes/routes_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,55 @@
expect(get: "admin/claims/#{claim.id}/tasks/foo").not_to be_routable
end
end

describe "Silence unwanted request from causing a Rollbar error and render a 404" do
context "unwanted extensions" do
it "returns a 404" do
%w[axd asp aspx cgi htm html php php7 pl txt xml].each do |extension|
expect(get: "foo.#{extension}").to route_to(controller: "application", action: "handle_unwanted_requests", path: "foo", format: extension)
end
end
end

context "folders" do
it "returns a 404 for .git/config" do
expect(get: ".git/config").to route_to(controller: "application", action: "handle_unwanted_requests", path: ".git/config")
end

it "returns a 404 for cgi-bin" do
expect(get: "cgi-bin/").to route_to(controller: "application", action: "handle_unwanted_requests", path: "cgi-bin")
end

it "returns a 404 for webui" do
expect(get: "webui/").to route_to(controller: "application", action: "handle_unwanted_requests", path: "webui")
end
end

context "apple icons" do
it "returns a 404" do
%w[
apple-touch-icon
apple-touch-icon-120x120-precomposed
apple-touch-icon-120x120
apple-touch-icon-precomposed
].each do |path|
expect(get: "#{path}.png").to route_to(controller: "application", action: "handle_unwanted_requests", path: path, format: "png")
end
end
end

context "wordpress" do
it "returns a 404" do
%w[
wordpress
wp
wp-admin
wp-content
wp-includes
].each do |path|
expect(get: path).to route_to(controller: "application", action: "handle_unwanted_requests", path: path)
end
end
end
end
end
Loading