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/index.php b/index.php index 362957c..96be144 100644 --- a/index.php +++ b/index.php @@ -1,5 +1,7 @@ ' . PHP_EOL; - print '' . PHP_EOL; + print '' . PHP_EOL; print ''; } @@ -548,23 +548,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..90d1360 100644 --- a/monitor_render.php +++ b/monitor_render.php @@ -962,7 +962,7 @@ function renderHeaderList(int $total_rows = 0, int $rows = 0): string { ob_start(); - $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'); html_start_box(__('Monitored Devices', 'monitor'), '100%', false, 3, 'center', ''); @@ -1042,7 +1042,7 @@ function renderFooterList(int $total_rows, int $rows): string { html_end_box(false); if ($total_rows > 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/setup.php b/setup.php index 283d533..2afafb9 100644 --- a/setup.php +++ b/setup.php @@ -1,4 +1,6 @@ [ + "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' => [ + "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..73be1e9 --- /dev/null +++ b/tests/e2e/test_monitor_no_raw_request_reuse.php @@ -0,0 +1,40 @@ + [ + "get_request_var('downhosts') . '\">'", + "get_request_var('site') . '\">'", + "get_request_var('template') . '\">'", + "get_request_var('size') . '\">'", + "get_request_var('trim') . '\">'", + ], + __DIR__ . '/../../monitor_render.php' => [ + "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..a9cd09b --- /dev/null +++ b/tests/unit/test_request_output_escaping.php @@ -0,0 +1,19 @@ +