Не могу настроить заголовок безопасности промежуточного ПО CakePHP - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть сайт, созданный с помощью CakePHP, по умолчанию он не позволяет вставлять поддомен в iframe.

  1. Я настроил опцию Frame на nginx/conf.d, и теперь моя домашняя страница может быть встроена в фрейм субдомена.
  2. Однако другой пост не может быть встроен в фрейм субдомена. (exp: http://example.net/postabc не будет отображаться). Я пытался изменить параметры в промежуточном программном обеспечении безопасности Header (см. Ниже).

  3. Есть ли где-нибудь, где мне нужно изменить конфигурацию, чтобы можно было отображать все мои сообщения?

<?php
namespace Cake\Http\Middleware;
use InvalidArgumentException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

class SecurityHeadersMiddleware
{
    protected $headers = [];

    public function noSniff()
    {
        $this->headers['x-content-type-options'] = 'nosniff';

        return $this;
    }
    public function noOpen()
    {
        $this->headers['x-download-options'] = 'noopen';

        return $this;
    }

    public function setReferrerPolicy($policy = 'same-origin')
    {
        $available = [
            'no-referrer', 'no-referrer-when-downgrade', 'origin',
            'origin-when-cross-origin',
            'same-origin', 'strict-origin', 'strict-origin-when-cross-origin',
            'unsafe-url'
        ];

        $this->checkValues($policy, $available);
        $this->headers['referrer-policy'] = $policy;

        return $this;
    }

    public function setXFrameOptions($option = 'allow-from', $url = 'http://subdomain.example.net')
    {
        $this->checkValues($option, ['deny', 'sameorigin', 'allow-from']);

        if ($option === 'allow-from') {
            if (empty($url)) {
                throw new InvalidArgumentException('The 2nd arg $url can not be empty when `allow-from` is used');
            }
            $option .= ' ' . $url;
        }

        $this->headers['x-frame-options'] = $option;

        return $this;
    }

    public function setXssProtection($mode = 'block')
    {
        $mode = (string)$mode;

        if ($mode === 'block') {
            $mode = '1; mode=block';
        }

        $this->checkValues($mode, ['1', '0', '1; mode=block']);
        $this->headers['x-xss-protection'] = $mode;

        return $this;
    }


    public function setCrossDomainPolicy($policy = 'all')
    {
        $this->checkValues($policy, ['all', 'none', 'master-only', 'by-content-type', 'by-ftp-filename']);
        $this->headers['x-permitted-cross-domain-policies'] = $policy;

        return $this;
    }


    protected function checkValues($value, array $allowed)
    {
        if (!in_array($value, $allowed)) {
            throw new InvalidArgumentException(sprintf(
                'Invalid arg `%s`, use one of these: %s',
                $value,
                implode(', ', $allowed)
            ));
        }
    }


    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
    {
        $response = $next($request, $response);
        foreach ($this->headers as $header => $value) {
            $response = $response->withHeader($header, $value);
        }

        return $response;
    }
}
...