Path rules and trap paths match the path decoded once too (closes #85)
check / check (push) Waiting to run

A path rule matched only the path as the client sent it, so /%2eenv got
past the default env-file rule while an app that decodes the path
serves /.env. A path rule now matches the path as sent or decoded once,
as a uri rule already did, and so does a path in SWWAF_TRAP_PATHS:
/%77p-login.php matches /wp-login.php. The query is cut off before the
path is decoded, and the path is decoded only once, so /%252eenv is not
/.env. A ban's notes keep the path as sent. SPEC.md and README.md say
so.

Model: opus-5-5
This commit was merged in pull request #125.
This commit is contained in:
2026-10-14 18:20:31 +02:00
parent 6fcbda6ece
commit 27f0007b54
8 changed files with 79 additions and 45 deletions
+2 -1
View File
@@ -1665,7 +1665,8 @@ func parsePathPrefixes(value string) ([]string, error) {
// parseTrapPaths reads a comma-separated list of trap paths. Each is
// matched against a request's path as a path rule is, without the query,
// so a path that does not start with / or holds a ? would never match.
// so a path that does not start with / would never match, and one that
// holds a ? is written with a query.
func parseTrapPaths(value string) ([]string, error) {
paths, err := parseList(value)
if err != nil {