Skip to content

Commit ac00724

Browse files
Merge branch '3.4' into 4.4
* 3.4: [Filesystem] Handle paths on different drives [WebProfiler] Do not add src-elem CSP directives if they do not exist [Yaml] fix parse error when unindented collections contain a comment [3.4][Inflector] Improve testSingularize() argument name [PhpUnitBridge] fix PHP 5.3 compat again Skip validation when email is an empty object fix sr_Latn translation [Validator] fix lazy property usage. Fix annotation [PhpUnitBridge] fix compat with PHP 5.3 [DX] Show the ParseException message in YAML file loaders
2 parents aaeaa6a + 2f4566e commit ac00724

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

Csp/ContentSecurityPolicyHandler.php

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,11 @@ private function updateCspHeaders(Response $response, array $nonces = []): array
129129
continue;
130130
}
131131
if (!isset($headers[$header][$type])) {
132-
if (isset($headers[$header]['default-src'])) {
133-
$headers[$header][$type] = $headers[$header]['default-src'];
134-
} else {
135-
// If there is no script-src/style-src and no default-src, no additional rules required.
132+
if (null === $fallback = $this->getDirectiveFallback($directives, $type)) {
136133
continue;
137134
}
135+
136+
$headers[$header][$type] = $fallback;
138137
}
139138
$ruleIsSet = true;
140139
if (!\in_array('\'unsafe-inline\'', $headers[$header][$type], true)) {
@@ -199,9 +198,7 @@ private function authorizesInline(array $directivesSet, string $type): bool
199198
{
200199
if (isset($directivesSet[$type])) {
201200
$directives = $directivesSet[$type];
202-
} elseif (isset($directivesSet['default-src'])) {
203-
$directives = $directivesSet['default-src'];
204-
} else {
201+
} elseif (null === $directives = $this->getDirectiveFallback($directivesSet, $type)) {
205202
return false;
206203
}
207204

@@ -225,6 +222,16 @@ private function hasHashOrNonce(array $directives): bool
225222
return false;
226223
}
227224

225+
private function getDirectiveFallback(array $directiveSet, $type)
226+
{
227+
if (\in_array($type, ['script-src-elem', 'style-src-elem'], true) || !isset($directiveSet['default-src'])) {
228+
// Let the browser fallback on it's own
229+
return null;
230+
}
231+
232+
return $directiveSet['default-src'];
233+
}
234+
228235
/**
229236
* Retrieves the Content-Security-Policy headers (either X-Content-Security-Policy or Content-Security-Policy) from
230237
* a response.

Tests/Csp/ContentSecurityPolicyHandlerTest.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,14 @@ public function provideRequestAndResponsesForOnKernelResponse()
131131
['csp_script_nonce' => $nonce, 'csp_style_nonce' => $nonce],
132132
$this->createRequest(),
133133
$this->createResponse(['Content-Security-Policy' => 'default-src \'self\' domain.com; script-src \'self\' \'unsafe-inline\'', 'Content-Security-Policy-Report-Only' => 'default-src \'self\' domain-report-only.com; script-src \'self\' \'unsafe-inline\'']),
134-
['Content-Security-Policy' => 'default-src \'self\' domain.com; script-src \'self\' \'unsafe-inline\'; script-src-elem \'self\' domain.com \'unsafe-inline\' \'nonce-'.$nonce.'\'; style-src \'self\' domain.com \'unsafe-inline\' \'nonce-'.$nonce.'\'; style-src-elem \'self\' domain.com \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'Content-Security-Policy-Report-Only' => 'default-src \'self\' domain-report-only.com; script-src \'self\' \'unsafe-inline\'; script-src-elem \'self\' domain-report-only.com \'unsafe-inline\' \'nonce-'.$nonce.'\'; style-src \'self\' domain-report-only.com \'unsafe-inline\' \'nonce-'.$nonce.'\'; style-src-elem \'self\' domain-report-only.com \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'X-Content-Security-Policy' => null],
134+
['Content-Security-Policy' => 'default-src \'self\' domain.com; script-src \'self\' \'unsafe-inline\'; style-src \'self\' domain.com \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'Content-Security-Policy-Report-Only' => 'default-src \'self\' domain-report-only.com; script-src \'self\' \'unsafe-inline\'; style-src \'self\' domain-report-only.com \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'X-Content-Security-Policy' => null],
135+
],
136+
[
137+
$nonce,
138+
['csp_script_nonce' => $nonce, 'csp_style_nonce' => $nonce],
139+
$this->createRequest(),
140+
$this->createResponse(['Content-Security-Policy' => 'default-src \'self\' domain.com; script-src \'self\' \'unsafe-inline\'; script-src-elem \'self\'; style-src \'self\' \'unsafe-inline\'; style-src-elem \'self\'', 'Content-Security-Policy-Report-Only' => 'default-src \'self\' domain-report-only.com; script-src \'self\' \'unsafe-inline\'; script-src-elem \'self\'; style-src \'self\' \'unsafe-inline\'; style-src-elem \'self\'']),
141+
['Content-Security-Policy' => 'default-src \'self\' domain.com; script-src \'self\' \'unsafe-inline\'; script-src-elem \'self\' \'unsafe-inline\' \'nonce-'.$nonce.'\'; style-src \'self\' \'unsafe-inline\'; style-src-elem \'self\' \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'Content-Security-Policy-Report-Only' => 'default-src \'self\' domain-report-only.com; script-src \'self\' \'unsafe-inline\'; script-src-elem \'self\' \'unsafe-inline\' \'nonce-'.$nonce.'\'; style-src \'self\' \'unsafe-inline\'; style-src-elem \'self\' \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'X-Content-Security-Policy' => null],
135142
],
136143
[
137144
$nonce,

0 commit comments

Comments
 (0)