对于 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/