php - 如何说服 Zend Framework 发送重复的 header ?

标签 php content-security-policy zend-framework3

对于 Content-Security-Policy header ,通常需要发送多个这样的 header ,或者在发送这些 header 之前将它们联合起来。这是因为应用程序的每个模块/包都可以定义自己的 CSP。

目前ZF3似乎没有办法处理这种情况。如果我尝试添加多个 CSP header ,它们会不断相互覆盖,以便仅发送最后添加的 header 。

重现问题的代码

$headers = $controller->getResponse()->getHeaders();
$headers->addHeader(new ContentSecurityPolicy($someDirectives));
$headers->addHeader(new ContentSecurityPolicy($someOtherDirectives));

预期结果

预期结果是具有两个 CSP header (或联合合并的 CSP)的响应。

实际结果

第二个添加会覆盖第一个,响应仅包含该 CSP。

问题

如何让 ZF3 发送具有相同字段名的多个 header ?


有关此问题的更多信息,另请参阅我自己在 github 上的问题 https://github.com/zendframework/zend-http/issues/159

最佳答案

您应该能够使用 GenericMultipleHeader 创建一个简单的解决方法作为引用(并将逗号分隔符更改为分号):

class MultiContentSecurityPolicy extends ContentSecurityPolicy implements MultipleHeaderInterface {

    public static function fromString($headerLine)
    {
        list($fieldName, $fieldValue) = GenericHeader::splitHeaderLine($headerLine);
        if (strpos($fieldValue, ';')) {
            $headers = [];
            foreach (explode(';', $fieldValue) as $multiValue) {
                $headers[] = new static($fieldName, $multiValue);
            }
            return $headers;
        } else {
            $header = new static($fieldName, $fieldValue);
            return $header;
        }
    }

    public function toStringMultipleHeaders(array $headers)
    {
        $name  = $this->getFieldName();
        $values = [$this->getFieldValue()];
        foreach ($headers as $header) {
            if (! $header instanceof static) {
                throw new Exception\InvalidArgumentException(
                    'This method toStringMultipleHeaders was expecting an array of headers of the same type'
                );
            }
            $values[] = $header->getFieldValue();
        }
        return $name . ': ' . implode(';', $values) . "\r\n";
    }

}

然后使用该类而不是 ContentSecurityPolicy:

$headers = $controller->getResponse()->getHeaders();
$headers->addHeader(new MultiContentSecurityPolicy($someDirectives));
$headers->addHeader(new MultiContentSecurityPolicy($someOtherDirectives));

自 Zend checks the interface rather than the class ,应该可以正常工作。

关于php - 如何说服 Zend Framework 发送重复的 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52950565/

相关文章:

php - 根据浏览器视口(viewport),使用 javascript(无 jQuery)将 <div> 替换为 php 内容

php - 如何在 View 中获取匹配的路线名称 - Zend Expressive

php - isSaleable() 和 isAvailable() 有什么区别?

php - 在php中的url href中传递值

http - CORP 使用 CSP 沙箱集阻止明显同源请求

azure-ad-b2c - 登录 Azure B2C 页面上的内容安全策略错误

php - 互连服务的 ZF3 服务 DI 的有效模式

php - ZF3导航 "plugin"错误

php - 使用 Doctrine 迁移数据变得很慢

javascript - Chrome 扩展的内容安全策略问题