diff --git a/ProcessMaker/Http/Kernel.php b/ProcessMaker/Http/Kernel.php index 66cf5f2144..e3f9e8a0f5 100644 --- a/ProcessMaker/Http/Kernel.php +++ b/ProcessMaker/Http/Kernel.php @@ -27,6 +27,7 @@ class Kernel extends HttpKernel ServerTimingMiddleware::class, Middleware\FileSizeCheck::class, Middleware\AddTenantHeaders::class, + Middleware\HideServerHeaders::class, ]; /** diff --git a/ProcessMaker/Http/Middleware/HideServerHeaders.php b/ProcessMaker/Http/Middleware/HideServerHeaders.php new file mode 100644 index 0000000000..31a9258648 --- /dev/null +++ b/ProcessMaker/Http/Middleware/HideServerHeaders.php @@ -0,0 +1,89 @@ +shouldHideHeaders()) { + // Remove all server-revealing headers + foreach ($this->headersToRemove as $header) { + $response->headers->remove($header); + } + + // Set a generic server header to avoid revealing the absence + $response->headers->set('Server', 'ProcessMaker Server'); + } + + return $response; + } + + /** + * Determine if headers should be hidden based on environment + * + * @return bool + */ + private function shouldHideHeaders(): bool + { + // Hide headers in production or when explicitly configured + return app()->environment('production') || + config('app.hide_server_headers', false); + } +} diff --git a/config/app.php b/config/app.php index 71d8eb15c2..4106d36af8 100644 --- a/config/app.php +++ b/config/app.php @@ -41,6 +41,9 @@ // The timeout length for API calls, in milliseconds (0 for no timeout) 'api_timeout' => env('API_TIMEOUT', 5000), + // Hide server headers for security (prevents information disclosure) + 'hide_server_headers' => env('HIDE_SERVER_HEADERS', true), + // Disables PHP execution in the storage directory // TODO Is this config value still used anywhere? :) 'disable_php_upload_execution' => env('DISABLE_PHP_UPLOAD_EXECUTION', 0),