From 076ca1d74ea4f1f8b302af0a1fa57156513fad98 Mon Sep 17 00:00:00 2001 From: chen-zimmer-px Date: Wed, 12 Nov 2025 10:33:14 -0300 Subject: [PATCH 1/4] added monitored routes --- PerimeterXModule/Internals/PxContext.cs | 28 +++++++------------ .../PxModuleConfigurationSection.cs | 17 +++++++++++ px_metadata.json | 3 +- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/PerimeterXModule/Internals/PxContext.cs b/PerimeterXModule/Internals/PxContext.cs index 689d398..5875cb3 100644 --- a/PerimeterXModule/Internals/PxContext.cs +++ b/PerimeterXModule/Internals/PxContext.cs @@ -218,27 +218,19 @@ public PxContext(HttpContext context, PxModuleConfigurationSection pxConfigurati private bool shouldMonitorRequest(HttpContext context, PxModuleConfigurationSection pxConfiguration) { - string uri = context.Request.Url.AbsolutePath; - if (uri.IndexOf("/", StringComparison.Ordinal) == 0) - { - uri = uri.Substring(1); - } + string uri = context.Request.Url.AbsolutePath.TrimStart('/'); - var mitigationUrls = pxConfiguration.MitigationUrls; - if (mitigationUrls.Count > 0) - { - return !mitigationUrls.Contains(uri); - } + bool isMitigationRoute = pxConfiguration.MitigationUrls?.Contains(uri) == true; + bool isMonitoredRoute = pxConfiguration.MonitoredRoutes?.Contains(uri) == true; - if (!string.IsNullOrEmpty(pxConfiguration.ByPassMonitorHeader)) - { - if (context.Request.Headers[pxConfiguration.ByPassMonitorHeader] == "1") - { - return false; - } - } + bool isBypass = !string.IsNullOrEmpty(pxConfiguration.ByPassMonitorHeader) && + context.Request.Headers[pxConfiguration.ByPassMonitorHeader] == "1"; + + bool monitorMode = pxConfiguration.MonitorMode; + + bool shouldMonitor = !isMitigationRoute && (monitorMode || isMonitoredRoute) && !isBypass; - return pxConfiguration.MonitorMode; + return shouldMonitor; } private string[] extractCookieNames(string cookieHeader) diff --git a/PerimeterXModule/PxModuleConfigurationSection.cs b/PerimeterXModule/PxModuleConfigurationSection.cs index cc29d14..7f5fe75 100644 --- a/PerimeterXModule/PxModuleConfigurationSection.cs +++ b/PerimeterXModule/PxModuleConfigurationSection.cs @@ -579,6 +579,23 @@ public StringCollection MitigationUrls } } + + [ConfigurationProperty("monitoredRoutes", DefaultValue = "")] + [TypeConverter(typeof(CommaDelimitedStringCollectionConverter))] + public StringCollection MonitoredRoutes + { + get + { + return (StringCollection)this["monitoredRoutes"]; + } + + set + { + this["monitoredRoutes"] = value; + } + } + + [ConfigurationProperty("bypassMonitorHeader", DefaultValue = "")] public string ByPassMonitorHeader { diff --git a/px_metadata.json b/px_metadata.json index e9e25fe..1078e58 100644 --- a/px_metadata.json +++ b/px_metadata.json @@ -12,7 +12,7 @@ "custom_cookie_header", "custom_logo", "custom_parameters", - "enforce_specific_routes", + "enforced_routes", "filter_by_extension", "filter_by_route", "first_party", @@ -21,6 +21,7 @@ "mobile_support", "module_enable", "module_mode", + "monitored_routes", "page_requested_activity", "pxde", "pxhd", From 90acab9733888e934f7dccbada9aaa63da0e60cd Mon Sep 17 00:00:00 2001 From: chen-zimmer-px <101555597+chen-zimmer-px@users.noreply.github.com> Date: Thu, 13 Nov 2025 09:33:05 +0200 Subject: [PATCH 2/4] Apply suggestion from @ori-gold-px Co-authored-by: Ori Gold <77228321+ori-gold-px@users.noreply.github.com> --- PerimeterXModule/Internals/PxContext.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PerimeterXModule/Internals/PxContext.cs b/PerimeterXModule/Internals/PxContext.cs index 5875cb3..2589036 100644 --- a/PerimeterXModule/Internals/PxContext.cs +++ b/PerimeterXModule/Internals/PxContext.cs @@ -220,8 +220,8 @@ private bool shouldMonitorRequest(HttpContext context, PxModuleConfigurationSect { string uri = context.Request.Url.AbsolutePath.TrimStart('/'); - bool isMitigationRoute = pxConfiguration.MitigationUrls?.Contains(uri) == true; - bool isMonitoredRoute = pxConfiguration.MonitoredRoutes?.Contains(uri) == true; + bool isMitigationRoute = !!pxConfiguration.MitigationUrls?.Contains(uri); + bool isMonitoredRoute = !!pxConfiguration.MonitoredRoutes?.Contains(uri); bool isBypass = !string.IsNullOrEmpty(pxConfiguration.ByPassMonitorHeader) && context.Request.Headers[pxConfiguration.ByPassMonitorHeader] == "1"; From bafecb237555884ece2f9d31f660a7e5a37b788c Mon Sep 17 00:00:00 2001 From: chen-zimmer-px Date: Thu, 13 Nov 2025 04:34:58 -0300 Subject: [PATCH 3/4] Added changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ceeeb25..66e57fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) +## [3.5.0] - 2025-11-13 +### Added +- Added support for monitored routes feature + ## [3.4.0] - 2025-10-30 ### Added - Added support for custom parameters feature From 128a711edd7cec1fe566d671514d52e854677b3c Mon Sep 17 00:00:00 2001 From: chen-zimmer-px Date: Thu, 13 Nov 2025 06:33:55 -0300 Subject: [PATCH 4/4] fix --- PerimeterXModule/Internals/PxContext.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PerimeterXModule/Internals/PxContext.cs b/PerimeterXModule/Internals/PxContext.cs index 2589036..e388829 100644 --- a/PerimeterXModule/Internals/PxContext.cs +++ b/PerimeterXModule/Internals/PxContext.cs @@ -220,8 +220,8 @@ private bool shouldMonitorRequest(HttpContext context, PxModuleConfigurationSect { string uri = context.Request.Url.AbsolutePath.TrimStart('/'); - bool isMitigationRoute = !!pxConfiguration.MitigationUrls?.Contains(uri); - bool isMonitoredRoute = !!pxConfiguration.MonitoredRoutes?.Contains(uri); + bool isMitigationRoute = pxConfiguration.MitigationUrls?.Contains(uri) ?? false; + bool isMonitoredRoute = pxConfiguration.MonitoredRoutes?.Contains(uri) ?? false; bool isBypass = !string.IsNullOrEmpty(pxConfiguration.ByPassMonitorHeader) && context.Request.Headers[pxConfiguration.ByPassMonitorHeader] == "1";