Skip to content

Commit a08445f

Browse files
Add middleware hide server headers
1 parent 0317dec commit a08445f

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

ProcessMaker/Http/Kernel.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class Kernel extends HttpKernel
2727
ServerTimingMiddleware::class,
2828
Middleware\FileSizeCheck::class,
2929
Middleware\AddTenantHeaders::class,
30+
Middleware\HideServerHeaders::class,
3031
];
3132

3233
/**
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
3+
namespace ProcessMaker\Http\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
use Symfony\Component\HttpFoundation\Response;
8+
9+
class HideServerHeaders
10+
{
11+
/**
12+
* Headers that reveal server information and should be removed
13+
*
14+
* @var array
15+
*/
16+
private $headersToRemove = [
17+
// Server identification
18+
'Server',
19+
'X-Powered-By',
20+
'X-AspNet-Version',
21+
'X-AspNetMvc-Version',
22+
23+
// Web technologies and frameworks
24+
'X-Generator',
25+
'X-Drupal-Cache',
26+
'X-Varnish',
27+
'X-Cache',
28+
'X-Cache-Hits',
29+
'X-Framework',
30+
31+
// Load balancer and proxy information
32+
'X-Forwarded-For',
33+
'X-Real-IP',
34+
'X-Forwarded-Proto',
35+
'X-Forwarded-Host',
36+
'X-Forwarded-Server',
37+
'X-Forwarded-Port',
38+
39+
// Additional server information
40+
'X-Served-By',
41+
'X-Cache-Status',
42+
'X-Served-From',
43+
'X-Content-Source',
44+
'X-Request-ID',
45+
'X-Request-Id',
46+
47+
// PHP specific headers
48+
'X-PHP-Version',
49+
'X-PHP-Originating-Script',
50+
51+
// Development and debugging headers
52+
'X-Debug-Token',
53+
'X-Debug-Token-Link',
54+
'X-Symfony-Cache',
55+
];
56+
57+
/**
58+
* Handle an incoming request.
59+
*
60+
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
61+
*/
62+
public function handle(Request $request, Closure $next): Response
63+
{
64+
$response = $next($request);
65+
66+
// Only remove headers in production or when explicitly configured
67+
if ($this->shouldHideHeaders()) {
68+
// Remove all server-revealing headers
69+
foreach ($this->headersToRemove as $header) {
70+
$response->headers->remove($header);
71+
}
72+
73+
// Set a generic server header to avoid revealing the absence
74+
$response->headers->set('Server', 'Web Server');
75+
}
76+
77+
return $response;
78+
}
79+
80+
/**
81+
* Determine if headers should be hidden based on environment
82+
*
83+
* @return bool
84+
*/
85+
private function shouldHideHeaders(): bool
86+
{
87+
// Hide headers in production or when explicitly configured
88+
return app()->environment('production') ||
89+
config('app.hide_server_headers', false);
90+
}
91+
}

config/app.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141
// The timeout length for API calls, in milliseconds (0 for no timeout)
4242
'api_timeout' => env('API_TIMEOUT', 5000),
4343

44+
// Hide server headers for security (prevents information disclosure)
45+
'hide_server_headers' => env('HIDE_SERVER_HEADERS', true),
46+
4447
// Disables PHP execution in the storage directory
4548
// TODO Is this config value still used anywhere? :)
4649
'disable_php_upload_execution' => env('DISABLE_PHP_UPLOAD_EXECUTION', 0),

0 commit comments

Comments
 (0)