Skip to content

Commit 84d0da2

Browse files
committed
bug symfony#21318 Don't add csp-headers if none are required (arjenm)
This PR was merged into the 3.2 branch. Discussion ---------- Don't add csp-headers if none are required | Q | A | ------------- | --- | Branch? | 3.2 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | This PR is also the ticket | License | MIT In 3.2 a tool to adjust Content Security Policy headers in combination with the WebProfiler was added. We encountered a bug in its behavior. We had CSP-headers that did not have a script-src/style-src nor a default-src (it was something like `form-action: https:`). In that scenario, the ContentSecurityPolicyHandler would add `script-src: 'unsafe-inline' 'nonce-....'`, but that would actually change the "everything is allowed scenario" into "only inline and nonce-... is allowed". The result was _only_ the javascript of WebProfiler was allowed, rather than everything. This PR fixes the scenario where no default-src nor a script-src/style-src is provided. It simply continue's rather than treats it as an empty list of rules that need additional rules. ~A bug I did find, but not fix, is the fact that that `'unsafe-inline'` is ignored in at least Firefox and Chrome due to the fact there is also a nonce-element in the rule.~ Commits ------- 6fecc94 Don't add csp-headers if none are required
2 parents 87dcda8 + 6fecc94 commit 84d0da2

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

src/Symfony/Bundle/WebProfilerBundle/Csp/ContentSecurityPolicyHandler.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@ private function updateCspHeaders(Response $response, array $nonces = array())
135135
if (isset($headers[$header]['default-src'])) {
136136
$headers[$header][$type] = $headers[$header]['default-src'];
137137
} else {
138-
$headers[$header][$type] = array();
138+
// If there is no script-src/style-src and no default-src, no additional rules required.
139+
continue;
139140
}
140141
}
141142
$ruleIsSet = true;

src/Symfony/Bundle/WebProfilerBundle/Tests/Csp/ContentSecurityPolicyHandlerTest.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ public function provideRequestAndResponsesForOnKernelResponse()
118118
$this->createResponse($responseNonceHeaders),
119119
array('Content-Security-Policy' => null, 'X-Content-Security-Policy' => null),
120120
),
121+
array(
122+
$nonce,
123+
array('csp_script_nonce' => $nonce, 'csp_style_nonce' => $nonce),
124+
$this->createRequest(),
125+
$this->createResponse(array('Content-Security-Policy' => 'frame-ancestors https: ; form-action: https:')),
126+
array('Content-Security-Policy' => 'frame-ancestors https: ; form-action: https:', 'X-Content-Security-Policy' => null),
127+
),
121128
array(
122129
$nonce,
123130
array('csp_script_nonce' => $nonce, 'csp_style_nonce' => $nonce),
@@ -130,7 +137,7 @@ public function provideRequestAndResponsesForOnKernelResponse()
130137
array('csp_script_nonce' => $nonce, 'csp_style_nonce' => $nonce),
131138
$this->createRequest(),
132139
$this->createResponse(array('Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\'')),
133-
array('Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\'; style-src \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'X-Content-Security-Policy' => null),
140+
array('Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\'', 'X-Content-Security-Policy' => null),
134141
),
135142
array(
136143
$nonce,
@@ -144,21 +151,21 @@ public function provideRequestAndResponsesForOnKernelResponse()
144151
array('csp_script_nonce' => $nonce, 'csp_style_nonce' => $nonce),
145152
$this->createRequest(),
146153
$this->createResponse(array('X-Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\'')),
147-
array('X-Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\'; style-src \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'Content-Security-Policy' => null),
154+
array('X-Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\'', 'Content-Security-Policy' => null),
148155
),
149156
array(
150157
$nonce,
151158
array('csp_script_nonce' => $nonce, 'csp_style_nonce' => $nonce),
152159
$this->createRequest(),
153160
$this->createResponse(array('X-Content-Security-Policy' => 'script-src \'self\'')),
154-
array('X-Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\' \'nonce-'.$nonce.'\'; style-src \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'Content-Security-Policy' => null),
161+
array('X-Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'Content-Security-Policy' => null),
155162
),
156163
array(
157164
$nonce,
158165
array('csp_script_nonce' => $nonce, 'csp_style_nonce' => $nonce),
159166
$this->createRequest(),
160167
$this->createResponse(array('X-Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\' \'sha384-LALALALALAAL\'')),
161-
array('X-Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\' \'sha384-LALALALALAAL\' \'nonce-'.$nonce.'\'; style-src \'unsafe-inline\' \'nonce-'.$nonce.'\'', 'Content-Security-Policy' => null),
168+
array('X-Content-Security-Policy' => 'script-src \'self\' \'unsafe-inline\' \'sha384-LALALALALAAL\' \'nonce-'.$nonce.'\'', 'Content-Security-Policy' => null),
162169
),
163170
array(
164171
$nonce,

0 commit comments

Comments
 (0)