src/EventSubscriber/SecurityHeadersSubscriber.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  5. class SecurityHeadersSubscriber implements EventSubscriberInterface
  6. {
  7.     public static function getSubscribedEvents(): array
  8.     {
  9.         return [
  10.             ResponseEvent::class => 'onResponse',
  11.         ];
  12.     }
  13.     public function onResponse(ResponseEvent $event): void
  14.     {
  15.         if (!$event->isMainRequest()) {
  16.             return;
  17.         }
  18.         $response $event->getResponse();
  19.         $csp "default-src 'self'; img-src 'self' data: https://*.stripe.com; "
  20.             "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; "
  21.             "script-src 'self' 'unsafe-inline' https://js.stripe.com; "
  22.             "font-src 'self' data: https://fonts.gstatic.com; "
  23.             "connect-src 'self' https://api.stripe.com; "
  24.             "frame-src https://js.stripe.com https://checkout.stripe.com https://*.stripe.com; "
  25.             "frame-ancestors 'none'; base-uri 'self'";
  26.         if (!$response->headers->has('Content-Security-Policy')) {
  27.             $response->headers->set('Content-Security-Policy'$csp);
  28.         }
  29.         $response->headers->set('Referrer-Policy''strict-origin-when-cross-origin');
  30.         $response->headers->set('X-Content-Type-Options''nosniff');
  31.         $response->headers->set('X-Frame-Options''DENY');
  32.         $response->headers->set('Permissions-Policy''geolocation=(self), microphone=(), camera=(), payment=(), fullscreen=()');
  33.     }
  34. }