class ActionDispatch::HostAuthorization
default one will run, which responds with +403 Forbidden+.
application will be executed and rendered. If no response_app
is given, a
When a request comes to an unauthorized host, the response_app
the hosts a request can be sent to.
This middleware guards from DNS rebinding attacks by explicitly permitting
def authorized?(request)
def authorized?(request) origin_host = request.get_header("HTTP_HOST")&.slice(VALID_ORIGIN_HOST, 1) || "" forwarded_host = request.x_forwarded_host&.slice(VALID_FORWARDED_HOST, 1) || "" @permissions.allows?(origin_host) && (forwarded_host.blank? || @permissions.allows?(forwarded_host)) end
def call(env)
def call(env) return @app.call(env) if @permissions.empty? request = Request.new(env) if authorized?(request) mark_as_authorized(request) @app.call(env) else @response_app.call(env) end end
def initialize(app, hosts, response_app = nil)
def initialize(app, hosts, response_app = nil) @app = app @permissions = Permissions.new(hosts) @response_app = response_app || DEFAULT_RESPONSE_APP end
def mark_as_authorized(request)
def mark_as_authorized(request) request.set_header("action_dispatch.authorized_host", request.host) end