Skip to content

Commit bd504b1

Browse files
committed
chore: include a sample of violated code into CSP report.
New expression in CSP3 (https://www.w3.org/TR/CSP3/#changes-from-level-2): % Reports generated for inline violations will contain a sample attribute if the relevant directive contains the 'report-sample' expression. % Address to #226
1 parent b36ebc3 commit bd504b1

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

src/main/java/ru/mystamps/web/support/spring/security/ContentSecurityPolicyHeaderWriter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class ContentSecurityPolicyHeaderWriter implements HeaderWriter {
6868
private static final String REPORT_URI = "report-uri ";
6969

7070
// - 'https://cdn.jsdelivr.net' is required by languages.min.css (FIXME: GH #246)
71-
private static final String STYLE_SRC = "style-src https://cdn.jsdelivr.net ";
71+
private static final String STYLE_SRC = "style-src 'report-sample' https://cdn.jsdelivr.net ";
7272

7373
// - 'self' is required for our own CSS files
7474
private static final String STYLES_SELF = "'self'";
@@ -126,7 +126,7 @@ class ContentSecurityPolicyHeaderWriter implements HeaderWriter {
126126
// 'unsafe-hashed-attributes' from CSP3. Details:
127127
// https://github.com/jquery/jquery/blob/d71f6a53927ad02d/jquery.js#L1441-L1447
128128
// and https://w3c.github.io/webappsec-csp/#unsafe-hashed-attributes-usage)
129-
private static final String SCRIPT_SRC = "script-src 'unsafe-inline' ";
129+
private static final String SCRIPT_SRC = "script-src 'report-sample' 'unsafe-inline' ";
130130

131131
// - 'self' is required for our own JS files
132132
private static final String SCRIPTS_SELF = "'self'";

src/test/java/ru/mystamps/web/support/spring/security/ContentSecurityPolicyHeaderWriterTest.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public void onIndexPageWithLocalResources() {
7070
"img-src https://cdn.jsdelivr.net 'self'",
7171
"font-src 'self'",
7272
"report-uri http://127.0.0.1:8080/site/csp/reports",
73-
"style-src https://cdn.jsdelivr.net 'self'",
74-
"script-src 'unsafe-inline' 'self'"
73+
"style-src 'report-sample' https://cdn.jsdelivr.net 'self'",
74+
"script-src 'report-sample' 'unsafe-inline' 'self'"
7575
)
7676
.hasSize(NUMBER_OF_DIRECTIVES_ON_STANDARD_PAGES);
7777
}
@@ -91,12 +91,14 @@ public void onIndexPageWithResourcesFromCdn() {
9191
)
9292
.contains(
9393
"style-src "
94+
+ "'report-sample' "
9495
+ "https://cdn.jsdelivr.net "
9596
+ "https://stamps.filezz.ru "
9697
+ "https://maxcdn.bootstrapcdn.com"
9798
)
9899
.contains(
99100
"script-src "
101+
+ "'report-sample' "
100102
+ "'unsafe-inline' "
101103
+ "https://stamps.filezz.ru "
102104
+ "https://maxcdn.bootstrapcdn.com "
@@ -115,13 +117,15 @@ public void onCollectionInfoPageWithLocalResources() {
115117
assertThat(directives)
116118
.contains(
117119
"style-src "
120+
+ "'report-sample' "
118121
+ "https://cdn.jsdelivr.net "
119122
+ "'self' "
120123
+ "https://www.gstatic.com "
121124
+ "'sha256-/kXZODfqoc2myS1eI6wr0HH8lUt+vRhW8H/oL+YJcMg='"
122125
)
123126
.contains(
124127
"script-src "
128+
+ "'report-sample' "
125129
+ "'unsafe-inline' "
126130
+ "'self' "
127131
+ "'unsafe-eval' "
@@ -141,6 +145,7 @@ public void onCollectionInfoPageWithResourcesFromCdn() {
141145
assertThat(directives)
142146
.contains(
143147
"style-src "
148+
+ "'report-sample' "
144149
+ "https://cdn.jsdelivr.net "
145150
+ "https://stamps.filezz.ru "
146151
+ "https://maxcdn.bootstrapcdn.com "
@@ -149,6 +154,7 @@ public void onCollectionInfoPageWithResourcesFromCdn() {
149154
)
150155
.contains(
151156
"script-src "
157+
+ "'report-sample' "
152158
+ "'unsafe-inline' "
153159
+ "https://stamps.filezz.ru "
154160
+ "https://maxcdn.bootstrapcdn.com "
@@ -172,6 +178,7 @@ public void onSeriesAddImagePageWithLocalResources() {
172178
assertThat(directives)
173179
.contains(
174180
"style-src "
181+
+ "'report-sample' "
175182
+ "https://cdn.jsdelivr.net "
176183
+ "'self' "
177184
+ "'sha256-DpmxvnMJIlwkpmmAANZYNzmyfnX2PQCBDO4CB2BFjzU='"
@@ -194,13 +201,15 @@ public void onSeriesAddImagePageWithResourcesFromCdn() {
194201
assertThat(directives)
195202
.contains(
196203
"style-src "
204+
+ "'report-sample' "
197205
+ "https://cdn.jsdelivr.net "
198206
+ "https://stamps.filezz.ru "
199207
+ "https://maxcdn.bootstrapcdn.com "
200208
+ "'sha256-DpmxvnMJIlwkpmmAANZYNzmyfnX2PQCBDO4CB2BFjzU='"
201209
)
202210
.contains(
203211
"script-src "
212+
+ "'report-sample' "
204213
+ "'unsafe-inline' "
205214
+ "https://stamps.filezz.ru "
206215
+ "https://maxcdn.bootstrapcdn.com "
@@ -223,13 +232,15 @@ public void onSeriesAddPageWithLocalResources() {
223232
assertThat(directives)
224233
.contains(
225234
"style-src "
235+
+ "'report-sample' "
226236
+ "https://cdn.jsdelivr.net "
227237
+ "'self' "
228238
+ "'sha256-DpmxvnMJIlwkpmmAANZYNzmyfnX2PQCBDO4CB2BFjzU=' "
229239
+ "https://cdnjs.cloudflare.com"
230240
)
231241
.contains(
232242
"script-src "
243+
+ "'report-sample' "
233244
+ "'unsafe-inline' "
234245
+ "'self' "
235246
+ "https://cdnjs.cloudflare.com"
@@ -249,6 +260,7 @@ public void onSeriesAddPageWithResourcesFromCdn() {
249260
assertThat(directives)
250261
.contains(
251262
"style-src "
263+
+ "'report-sample' "
252264
+ "https://cdn.jsdelivr.net "
253265
+ "https://stamps.filezz.ru "
254266
+ "https://maxcdn.bootstrapcdn.com "
@@ -257,6 +269,7 @@ public void onSeriesAddPageWithResourcesFromCdn() {
257269
)
258270
.contains(
259271
"script-src "
272+
+ "'report-sample' "
260273
+ "'unsafe-inline' "
261274
+ "https://stamps.filezz.ru "
262275
+ "https://maxcdn.bootstrapcdn.com "
@@ -278,6 +291,7 @@ public void onH2ConsoleWithLocalResources() {
278291
assertThat(directives).
279292
contains(
280293
"style-src "
294+
+ "'report-sample' "
281295
+ "https://cdn.jsdelivr.net"
282296
+ " 'self'"
283297
+ " 'sha256-biLFinpqYMtWHmXfkA1BPeCY0/fNt46SAZ+BBk5YUog='"
@@ -309,6 +323,7 @@ public void onH2ConsoleWithResourcesFromCdn() {
309323
// "style-src" directive should be the same as for the index page
310324
.contains(
311325
"style-src "
326+
+ "'report-sample' "
312327
+ "https://cdn.jsdelivr.net "
313328
+ "https://stamps.filezz.ru "
314329
+ "https://maxcdn.bootstrapcdn.com"

0 commit comments

Comments
 (0)