diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index a98528d0f9e..8c71e219470 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -2,6 +2,7 @@ namespace BookStack\Http; +use BookStack\Http\Middleware\PreventAuthenticatedResponseCaching; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel @@ -30,6 +31,7 @@ class Kernel extends HttpKernel \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \BookStack\Http\Middleware\VerifyCsrfToken::class, + \BookStack\Http\Middleware\PreventAuthenticatedResponseCaching::class, \BookStack\Http\Middleware\CheckEmailConfirmed::class, \BookStack\Http\Middleware\RunThemeActions::class, \BookStack\Http\Middleware\Localization::class, @@ -39,6 +41,7 @@ class Kernel extends HttpKernel \BookStack\Http\Middleware\EncryptCookies::class, \BookStack\Http\Middleware\StartSessionIfCookieExists::class, \BookStack\Http\Middleware\ApiAuthenticate::class, + \BookStack\Http\Middleware\PreventAuthenticatedResponseCaching::class, \BookStack\Http\Middleware\CheckEmailConfirmed::class, ], ]; diff --git a/app/Http/Middleware/PreventAuthenticatedResponseCaching.php b/app/Http/Middleware/PreventAuthenticatedResponseCaching.php new file mode 100644 index 00000000000..3ad5b3914a1 --- /dev/null +++ b/app/Http/Middleware/PreventAuthenticatedResponseCaching.php @@ -0,0 +1,30 @@ +headers->set('Cache-Control', 'max-age=0, no-store, private'); + $response->headers->set('Pragma', 'no-cache'); + $response->headers->set('Expires', 'Sun, 12 Jul 2015 19:01:00 GMT'); + } + + return $response; + } +} diff --git a/tests/SecurityHeaderTest.php b/tests/SecurityHeaderTest.php index 2bde890ad58..10551fc55a8 100644 --- a/tests/SecurityHeaderTest.php +++ b/tests/SecurityHeaderTest.php @@ -119,6 +119,15 @@ public function test_base_uri_csp_header_set() $this->assertEquals('base-uri \'self\'', $scriptHeader); } + public function test_cache_control_headers_are_strict_on_responses_when_logged_in() + { + $this->asEditor(); + $resp = $this->get('/'); + $resp->assertHeader('Cache-Control', 'max-age=0, no-store, private'); + $resp->assertHeader('Pragma', 'no-cache'); + $resp->assertHeader('Expires', 'Sun, 12 Jul 2015 19:01:00 GMT'); + } + /** * Get the value of the first CSP header of the given type. */