diff --git a/.gitignore b/.gitignore
index f3d8733..7a6c551 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,4 @@
locales/po/*.mo
vendor/
+.omc/
diff --git a/db_functions.php b/db_functions.php
index dac37e2..1cfdb35 100644
--- a/db_functions.php
+++ b/db_functions.php
@@ -1,6 +1,7 @@
' . PHP_EOL;
- print '' . PHP_EOL;
+ print '' . PHP_EOL;
print '';
}
@@ -548,23 +549,23 @@ function monitorRenderGroupingDropdowns(array $classes, array $criticalities, ar
*/
function monitorRenderHiddenFilterInputs(): void {
if (get_request_var('grouping') != 'tree') {
- print '
| ' . PHP_EOL;
+ print ' | ' . PHP_EOL;
}
if (get_request_var('grouping') != 'site') {
- print ' | ' . PHP_EOL;
+ print ' | ' . PHP_EOL;
}
if (get_request_var('grouping') != 'template') {
- print ' | ' . PHP_EOL;
+ print ' | ' . PHP_EOL;
}
if (get_request_var('view') == 'list') {
- print ' | ' . PHP_EOL;
+ print ' | ' . PHP_EOL;
}
if (get_request_var('view') != 'default') {
- print ' | ' . PHP_EOL;
+ print ' | ' . PHP_EOL;
}
}
diff --git a/monitor_render.php b/monitor_render.php
index 98c706d..c4ab2a4 100644
--- a/monitor_render.php
+++ b/monitor_render.php
@@ -1,6 +1,7 @@
0) {
- $nav = html_nav_bar('monitor.php?rfilter=' . get_request_var('rfilter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 12, __('Devices'), 'page', 'main');
+ $nav = html_nav_bar('monitor.php?rfilter=' . rawurlencode(get_request_var('rfilter')), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 12, __('Devices'), 'page', 'main');
print $nav;
}
diff --git a/poller_functions.php b/poller_functions.php
index ddb8568..76b8d85 100644
--- a/poller_functions.php
+++ b/poller_functions.php
@@ -1,6 +1,7 @@
array(
+ "html_escape(get_request_var('downhosts'))",
+ "html_escape(get_request_var('mute'))",
+ "html_escape(get_request_var('tree'))",
+ "html_escape(get_request_var('site'))",
+ "html_escape(get_request_var('template'))",
+ "html_escape(get_request_var('size'))",
+ "html_escape(get_request_var('trim'))",
+ ),
+ __DIR__ . '/../../monitor_render.php' => array(
+ "rawurlencode(get_request_var('rfilter'))",
+ ),
+);
+
+foreach ($checks as $path => $patterns) {
+ $contents = file_get_contents($path);
+
+ if ($contents === false) {
+ fwrite(STDERR, "Unable to read {$path}\n");
+ exit(1);
+ }
+
+ foreach ($patterns as $pattern) {
+ if (strpos($contents, $pattern) === false) {
+ fwrite(STDERR, "Missing expected output hardening: {$pattern}\n");
+ exit(1);
+ }
+ }
+}
+
+print "OK\n";
diff --git a/tests/e2e/test_monitor_no_raw_request_reuse.php b/tests/e2e/test_monitor_no_raw_request_reuse.php
new file mode 100644
index 0000000..f9c7ce6
--- /dev/null
+++ b/tests/e2e/test_monitor_no_raw_request_reuse.php
@@ -0,0 +1,40 @@
+ array(
+ "get_request_var('downhosts') . '\">'",
+ "get_request_var('site') . '\">'",
+ "get_request_var('template') . '\">'",
+ "get_request_var('size') . '\">'",
+ "get_request_var('trim') . '\">'",
+ ),
+ __DIR__ . '/../../monitor_render.php' => array(
+ "monitor.php?rfilter=' . get_request_var('rfilter')",
+ ),
+);
+
+foreach ($checks as $path => $patterns) {
+ $contents = file_get_contents($path);
+
+ if ($contents === false) {
+ fwrite(STDERR, "Unable to read {$path}\n");
+ exit(1);
+ }
+
+ foreach ($patterns as $pattern) {
+ if (strpos($contents, $pattern) !== false) {
+ fwrite(STDERR, "Raw request reuse remains: {$pattern}\n");
+ exit(1);
+ }
+ }
+}
+
+print "OK\n";
diff --git a/tests/unit/test_request_output_escaping.php b/tests/unit/test_request_output_escaping.php
new file mode 100644
index 0000000..af07b0a
--- /dev/null
+++ b/tests/unit/test_request_output_escaping.php
@@ -0,0 +1,19 @@
+