aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2023-06-03 21:53:20 +0200
committerKim Alvefur <zash@zash.se>2023-06-03 21:53:20 +0200
commit16381e754de9c633c080784286ff2b141299e136 (patch)
tree2a2bf0e4d16d58524f63e58da293420d6890d977
parent8c92b32b7aa5b1457663bf39c4891fcc11fce8e5 (diff)
downloadprosody-16381e754de9c633c080784286ff2b141299e136.tar.gz
prosody-16381e754de9c633c080784286ff2b141299e136.zip
mod_http: Make RFC 7239 Forwarded opt-in for now to be safe
Supporting both methods at the same time may open to spoofing attacks, whereby a client sends a Forwarded header that is not stripped by a reverse proxy, leading Prosody to use that instead of the X-Forwarded-* headers actually sent by the proxy. By only supporting one at a time, it can be configured to match what the proxy uses. Disabled by default since implementations are sparse and X-Forwarded-* are everywhere.
-rw-r--r--CHANGES2
-rw-r--r--plugins/mod_http.lua13
2 files changed, 11 insertions, 4 deletions
diff --git a/CHANGES b/CHANGES
index b91aced8..b34608b9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -42,7 +42,7 @@ TRUNK
- mod_blocklist: New option 'migrate_legacy_blocking' to disable migration from mod_privacy
- Ability to use SQLite3 storage using LuaSQLite3 instead of LuaDBI
- Moved all modules into the Lua namespace `prosody.`
-- Forwarded header from RFC 7239 supported
+- Forwarded header from RFC 7239 supported, disabled by default
## Removed
diff --git a/plugins/mod_http.lua b/plugins/mod_http.lua
index edf220a8..9e07bbea 100644
--- a/plugins/mod_http.lua
+++ b/plugins/mod_http.lua
@@ -333,11 +333,17 @@ local function get_forwarded_connection_info(request) --> ip:string, secure:bool
break
end
end
-
- -- Ignore legacy X-Forwarded-For and X-Forwarded-Proto, handling both seems unfeasible.
- return ip, secure;
end
+ return ip, secure;
+end
+
+-- TODO switch to RFC 7239 by default once support is more common
+if module:get_option_boolean("http_legacy_x_forwarded", true) then
+function get_forwarded_connection_info(request) --> ip:string, secure:boolean
+ local ip = request.ip;
+ local secure = request.secure; -- set by net.http.server
+
local forwarded_for = request.headers.x_forwarded_for;
if forwarded_for then
-- luacheck: ignore 631
@@ -360,6 +366,7 @@ local function get_forwarded_connection_info(request) --> ip:string, secure:bool
return ip, secure;
end
+end
module:wrap_object_event(server._events, false, function (handlers, event_name, event_data)
local request = event_data.request;