From 069ecd8d6abbf3c1565e778a1ac8bc52e07dc5b9 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 01:01:17 -0500 Subject: [PATCH 001/239] Migrate `onFinish` callback Trigger `process.exit ()` on completed TAP test run within test helper --- test/serve.es | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/serve.es b/test/serve.es index 34ad5b21b29..cde7cc4132a 100644 --- a/test/serve.es +++ b/test/serve.es @@ -2,8 +2,5 @@ const server = new (require ('server')) -require ('tape') - .onFinish (process.exit) - module.exports = server.serve.bind (server) From 8f0438d975eacf2f3321dac7b6e1ee4df460ebcd Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 03:03:09 -0500 Subject: [PATCH 002/239] Fix grammatical error --- middleware/security.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/security.test b/middleware/security.test index e97b95c75b4..2ef1a6946c6 100644 --- a/middleware/security.test +++ b/middleware/security.test @@ -14,7 +14,7 @@ const , Server = require ('server') -test ('calling next middlewaree') +test ('calling next middleware') test ('X-XSS-Protection: 1; mode=block', async t => { From e406127356f62c195152b1a91988f1b86e043769 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 03:03:47 -0500 Subject: [PATCH 003/239] Convert to using object deconstruction --- middleware/security.test | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/middleware/security.test b/middleware/security.test index 2ef1a6946c6..09aff2581e3 100644 --- a/middleware/security.test +++ b/middleware/security.test @@ -11,7 +11,8 @@ const { test, fetch } = require ('test') -, Server = require ('server') +, { Server } + = require ('..') test ('calling next middleware') From 869d0ee2e976a4b1b15b956bdca5ff51a72cc5e2 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 03:09:44 -0500 Subject: [PATCH 004/239] Add middleware/policy to loader --- middleware/index.es | 1 + 1 file changed, 1 insertion(+) diff --git a/middleware/index.es b/middleware/index.es index 43a1e692d01..dc3ffb6c0ff 100644 --- a/middleware/index.es +++ b/middleware/index.es @@ -6,6 +6,7 @@ module.exports = { auth : require ('./auth') , cors : require ('./cors') , security : require ('./security') +, policy : require ('./policy') , browse : require ('./browse') , snuggsi : require ('./snuggsi') , route : require ('./route') From 5d02e1041e183b65cc6693f2ccab89ec112a4e59 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 03:09:58 -0500 Subject: [PATCH 005/239] Add middleware/policy to test loader --- middleware/index.test | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/middleware/index.test b/middleware/index.test index 07f1f744931..f14faae7c32 100644 --- a/middleware/index.test +++ b/middleware/index.test @@ -3,5 +3,9 @@ require ('./cors.test') require ('./security.test') require ('./snuggsi.test') require ('./route.test') +require ('./policy.test') +require ('./compressor.test') +require ('./negotiator.test') +require ('./librarian.test') require ('./assets.test') From 9e8f456ba861cc1914ed1da68507502cc6dcc637 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 03:10:39 -0500 Subject: [PATCH 006/239] Add middleware/policy implementaion --- middleware/policy.es | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 middleware/policy.es diff --git a/middleware/policy.es b/middleware/policy.es new file mode 100644 index 00000000000..c9a943dcdd2 --- /dev/null +++ b/middleware/policy.es @@ -0,0 +1,25 @@ +const + { test, fetch } + = require ('test') + +, { Server } + = require ('..') + + +console.warn ((new Server).serve) + +test.only ('calling next middleware') + + +test ('Content-Security-Policy', async t => { + + const + server = (new Server).serve `` + , response = await fetch ('http://localhost:8181/') + + + t.ok (response.headers) + + server.close `` + t.end () +}) From cdbdbccd76b76601bfbc68d2899cddd902838e08 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 03:11:21 -0500 Subject: [PATCH 007/239] Add middleware/policy.test suite to cover Content Security Policy --- middleware/policy.test | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 middleware/policy.test diff --git a/middleware/policy.test b/middleware/policy.test new file mode 100644 index 00000000000..c9a943dcdd2 --- /dev/null +++ b/middleware/policy.test @@ -0,0 +1,25 @@ +const + { test, fetch } + = require ('test') + +, { Server } + = require ('..') + + +console.warn ((new Server).serve) + +test.only ('calling next middleware') + + +test ('Content-Security-Policy', async t => { + + const + server = (new Server).serve `` + , response = await fetch ('http://localhost:8181/') + + + t.ok (response.headers) + + server.close `` + t.end () +}) From f785aff6e5728ab361a484fe3ff6a55142915d9e Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 03:12:03 -0500 Subject: [PATCH 008/239] Update test helper functionality --- middleware/policy.es | 25 ------------------------- test/index.es | 21 +++++++++++++++++---- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index c9a943dcdd2..e69de29bb2d 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -1,25 +0,0 @@ -const - { test, fetch } - = require ('test') - -, { Server } - = require ('..') - - -console.warn ((new Server).serve) - -test.only ('calling next middleware') - - -test ('Content-Security-Policy', async t => { - - const - server = (new Server).serve `` - , response = await fetch ('http://localhost:8181/') - - - t.ok (response.headers) - - server.close `` - t.end () -}) diff --git a/test/index.es b/test/index.es index 2e486eb622c..c4d7236b380 100644 --- a/test/index.es +++ b/test/index.es @@ -1,17 +1,21 @@ console.warn ('loading test helper') const - { test } + fetch = + ( resource, ... options ) => + require ('node-fetch') (resource, ... options) + +, { test, onFinish : finish } = require ('tape') -, fetch - = ( resource, ... options ) => - require ('node-fetch') (resource, ... options) + +finish (process.exit) module.exports = { test , fetch +<<<<<<< HEAD // See chunked responses // http://taylor.fausak.me/2013/02/17/testing-a-node-js-http-server-with-mocha/ @@ -19,4 +23,13 @@ module.exports = { , read : require ('./read') , serve : require ('./serve') , browse : require ('./browse') +======= +, read : require ('./read') +, serve : require ('./serve') +, browse : require ('./browse') + +// See chunked responses +// http://taylor.fausak.me/2013/02/17/testing-a-node-js-http-server-with-mocha/ +, get : require ('http').get +>>>>>>> Update test helper functionality } From 288b4fd8011e594e02b8473fce52f1b95832ba7c Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 03:15:43 -0500 Subject: [PATCH 009/239] Remove only test from middleware --- middleware/policy.test | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index c9a943dcdd2..475a0a67d92 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -6,9 +6,7 @@ const = require ('..') -console.warn ((new Server).serve) - -test.only ('calling next middleware') +test ('calling next middleware') test ('Content-Security-Policy', async t => { From f8247c990f7cde645ecbb494a3d726cc242ed3e8 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 21:27:12 -0500 Subject: [PATCH 010/239] Add Node Security Platform link --- middleware/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/middleware/README.md b/middleware/README.md index d4f0fd0f4f1..db8ea5676ed 100644 --- a/middleware/README.md +++ b/middleware/README.md @@ -12,6 +12,7 @@ Middleware used for CSP (Content Security Policy). - https://medium.com/square-corner-blog/content-security-policy-for-single-page-web-apps-78f2b2cf1757 - https://www.owasp.org/index.php/HTTP_Strict_Transport_Security_Cheat_Sheet + - Node Security Platform - https://nodesecurity.io/resources ## snuggsi.route From a53d3275cd17a6e28f7aa64bfcb6bdfcc3e36613 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 21:56:07 -0500 Subject: [PATCH 011/239] Add CORS section to middleware/README.md --- middleware/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/middleware/README.md b/middleware/README.md index db8ea5676ed..5f234401157 100644 --- a/middleware/README.md +++ b/middleware/README.md @@ -1,6 +1,11 @@ # middleware +## snuggsi.cors + +Cross Origin Resource Sharing + + ## snuggsi.auth Middleware used for Authentication. From 8a2bab2d4d7023fea038e5b8dc805f9b06f02dac Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 21:56:32 -0500 Subject: [PATCH 012/239] Add security and policy information to middlware/README.md --- middleware/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/middleware/README.md b/middleware/README.md index 5f234401157..e53b0e4e042 100644 --- a/middleware/README.md +++ b/middleware/README.md @@ -13,6 +13,11 @@ Middleware used for Authentication. ## snuggsi.security +Browser security for frames and XSS attacks + + +## snuggsi.policy + Middleware used for CSP (Content Security Policy). - https://medium.com/square-corner-blog/content-security-policy-for-single-page-web-apps-78f2b2cf1757 From e1b62e9f9a13ccc2e6e15377e14ee0808a2a7d27 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 21:56:58 -0500 Subject: [PATCH 013/239] Add middleware/policies.es implementation --- middleware/policy.es | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/middleware/policy.es b/middleware/policy.es index e69de29bb2d..d12e36eda39 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -0,0 +1,16 @@ +const + policies = [ + `default-src 'none';` + ] + +module.exports = options => + + async (context, next) => { + + await next () + + for + ( let policy of policies ) + context.set + ('Content-Security-Policy', policy) + } From 0a7266205cf201c7b00bad7879d15245392626af Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 21:58:09 -0500 Subject: [PATCH 014/239] Test Content-Security-Policy: default-src 'none' --- middleware/policy.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index 475a0a67d92..50697643eeb 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -9,14 +9,14 @@ const test ('calling next middleware') -test ('Content-Security-Policy', async t => { +test ("Content-Security-Policy: default-src 'none';", async t => { const server = (new Server).serve `` , response = await fetch ('http://localhost:8181/') - t.ok (response.headers) + t.ok (response.headers.get ('content-security-policy')) server.close `` t.end () From cda76fe1a60d562dc66b5cd223a8d6ab62c441c9 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 21:58:42 -0500 Subject: [PATCH 015/239] Test Stub Content-Security-Policy --- middleware/policy.test | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/middleware/policy.test b/middleware/policy.test index 50697643eeb..7e78b32dfaa 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -21,3 +21,8 @@ test ("Content-Security-Policy: default-src 'none';", async t => { server.close `` t.end () }) + + +test ("Content-Security-Policy: script-src 'self';") +test ("Content-Security-Policy: img-src 'self' https://cdn.example.com;") +test ("Content-Security-Policy: connect-src 'self';") From 3a4ee5d7dc511d0554d6b4d4a877bbf237f2638c Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 21:58:51 -0500 Subject: [PATCH 016/239] Add whitespace formatting --- middleware/security.es | 1 + 1 file changed, 1 insertion(+) diff --git a/middleware/security.es b/middleware/security.es index 2d96ef67364..d8aca841858 100644 --- a/middleware/security.es +++ b/middleware/security.es @@ -13,6 +13,7 @@ const module.exports = options => async (context, next) => { + await next () context.set From 119c7d993d2d4c0aad204d027e478b94350cce9e Mon Sep 17 00:00:00 2001 From: Snuggs Date: Thu, 18 Jan 2018 22:00:13 -0500 Subject: [PATCH 017/239] Add policy middleware to default Server stack --- server/index.es | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/index.es b/server/index.es index 72b44ea51aa..bfd2ff78795 100644 --- a/server/index.es +++ b/server/index.es @@ -1,5 +1,5 @@ const - { cors, security, snuggsi, negotiator, assets } + { auth, cors, security, policy, compressor, negotiator, librarian, mixins, assets } = require ('middleware') @@ -10,6 +10,7 @@ module.exports = class extends require ('koa') { for (let slice of [ cors // why is this NOT a function... , security `` // and this IS a function? + , policy () // and this IS a function? , ... middleware , snuggsi ]) this.use (slice) From 9dd19675a9be4c22df65cd2fd51d386e4cdded72 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 09:58:28 -0500 Subject: [PATCH 018/239] Add default stubs for Content-Security-Policy --- middleware/policy.es | 4 +++- middleware/policy.test | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index d12e36eda39..2473f4a3d87 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -1,8 +1,10 @@ const + policies = [ - `default-src 'none';` + `default-src 'none';` // `default-src 'self' https://${domain};` ] + module.exports = options => async (context, next) => { diff --git a/middleware/policy.test b/middleware/policy.test index 7e78b32dfaa..659f80fd43b 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -23,6 +23,9 @@ test ("Content-Security-Policy: default-src 'none';", async t => { }) -test ("Content-Security-Policy: script-src 'self';") +test ("Content-Security-Policy: frame-src 'self';") +test ("Content-Security-Policy: style-src 'self';") test ("Content-Security-Policy: img-src 'self' https://cdn.example.com;") +test ("Content-Security-Policy: script-src 'self';") test ("Content-Security-Policy: connect-src 'self';") +test ("Content-Security-Policy: report-uri 'self';") From 59c4bd13775311e68ade0e6f1e1e4a8d955b5e5a Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 10:31:32 -0500 Subject: [PATCH 019/239] Add report-uri for Content-Security-Policy --- middleware/policy.test | 3 +++ 1 file changed, 3 insertions(+) diff --git a/middleware/policy.test b/middleware/policy.test index 659f80fd43b..db7cb5dda7c 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -9,6 +9,9 @@ const test ('calling next middleware') +test ("Content-Security-Policy: report-uri 'self';") + + test ("Content-Security-Policy: default-src 'none';", async t => { const From cd0bbb6e90915c7707af12d03f40f1c82c5e117f Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 10:31:42 -0500 Subject: [PATCH 020/239] Add default stubs for Content-Security-Policy --- middleware/policy.test | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index db7cb5dda7c..442aee66232 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -27,8 +27,7 @@ test ("Content-Security-Policy: default-src 'none';", async t => { test ("Content-Security-Policy: frame-src 'self';") -test ("Content-Security-Policy: style-src 'self';") +test ("Content-Security-Policy: connect-src 'self';") test ("Content-Security-Policy: img-src 'self' https://cdn.example.com;") +test ("Content-Security-Policy: style-src 'self';") test ("Content-Security-Policy: script-src 'self';") -test ("Content-Security-Policy: connect-src 'self';") -test ("Content-Security-Policy: report-uri 'self';") From 73bbde2504810f18229b2c6836302e2a68c75ab3 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:35:52 -0500 Subject: [PATCH 021/239] Add test for style-src none --- middleware/policy.es | 10 ++++------ middleware/policy.test | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 2473f4a3d87..14ac289e9ec 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -1,7 +1,7 @@ const - policies = [ - `default-src 'none';` // `default-src 'self' https://${domain};` + `default-src 'none'` // `default-src 'self' https://${domain};` + , `style-src 'none'` // `style-src 'self' 'unsafe-inline' https://cdn.example.com ] @@ -11,8 +11,6 @@ module.exports = options => await next () - for - ( let policy of policies ) - context.set - ('Content-Security-Policy', policy) + context.set + ( 'Content-Security-Policy', policies.join `; ` ) } diff --git a/middleware/policy.test b/middleware/policy.test index 442aee66232..4fe3d42b122 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -29,5 +29,22 @@ test ("Content-Security-Policy: default-src 'none';", async t => { test ("Content-Security-Policy: frame-src 'self';") test ("Content-Security-Policy: connect-src 'self';") test ("Content-Security-Policy: img-src 'self' https://cdn.example.com;") -test ("Content-Security-Policy: style-src 'self';") + + +test.only ("Content-Security-Policy: style-src 'none';", async t => { + + const + server = (new Server).serve `` + , response = await fetch ('http://localhost:8181/') + + + console.log (response.headers) + + t.ok (response.headers.get ('content-security-policy')) + + server.close `` + t.end () +}) + + test ("Content-Security-Policy: script-src 'self';") From 356dbbe4f6f4e91528007d5f08b34ff6b00e436a Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:37:30 -0500 Subject: [PATCH 022/239] Use include for header comparison --- middleware/policy.test | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/middleware/policy.test b/middleware/policy.test index 4fe3d42b122..d465e44e9ef 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -40,7 +40,8 @@ test.only ("Content-Security-Policy: style-src 'none';", async t => { console.log (response.headers) - t.ok (response.headers.get ('content-security-policy')) + t.ok + (response.headers.get ('content-security-policy').includes `style-src 'none'`) server.close `` t.end () From 63756f53649e75b66fd65372ad1a959757441d90 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:37:49 -0500 Subject: [PATCH 023/239] Remove console.logs --- middleware/policy.test | 2 -- 1 file changed, 2 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index d465e44e9ef..4fb416eab42 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -38,8 +38,6 @@ test.only ("Content-Security-Policy: style-src 'none';", async t => { , response = await fetch ('http://localhost:8181/') - console.log (response.headers) - t.ok (response.headers.get ('content-security-policy').includes `style-src 'none'`) From 6492df1fa466025e4b7ed9f8f64675a27263b69b Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:38:28 -0500 Subject: [PATCH 024/239] Remove semicolons from test definition --- middleware/policy.test | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index 4fb416eab42..ccd16651ba2 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -9,10 +9,10 @@ const test ('calling next middleware') -test ("Content-Security-Policy: report-uri 'self';") +test ("Content-Security-Policy: report-uri 'self'") -test ("Content-Security-Policy: default-src 'none';", async t => { +test ("Content-Security-Policy: default-src 'none'", async t => { const server = (new Server).serve `` @@ -26,12 +26,12 @@ test ("Content-Security-Policy: default-src 'none';", async t => { }) -test ("Content-Security-Policy: frame-src 'self';") -test ("Content-Security-Policy: connect-src 'self';") -test ("Content-Security-Policy: img-src 'self' https://cdn.example.com;") +test ("Content-Security-Policy: frame-src 'self'") +test ("Content-Security-Policy: connect-src 'self'") +test ("Content-Security-Policy: img-src 'self' https://cdn.example.com") -test.only ("Content-Security-Policy: style-src 'none';", async t => { +test.only ("Content-Security-Policy: style-src 'none'", async t => { const server = (new Server).serve `` @@ -46,4 +46,4 @@ test.only ("Content-Security-Policy: style-src 'none';", async t => { }) -test ("Content-Security-Policy: script-src 'self';") +test ("Content-Security-Policy: script-src 'self'") From 1f0e130a7dfebabeb41baedf8a15cc9d16d2658e Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:39:56 -0500 Subject: [PATCH 025/239] Refactor selectors to use includes --- middleware/policy.test | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/middleware/policy.test b/middleware/policy.test index ccd16651ba2..0badca9652f 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -17,9 +17,10 @@ test ("Content-Security-Policy: default-src 'none'", async t => { const server = (new Server).serve `` , response = await fetch ('http://localhost:8181/') + , policy = response.headers.get ('content-security-policy') - t.ok (response.headers.get ('content-security-policy')) + t.ok ( policy.includes `default-src 'none'` ) server.close `` t.end () From 549bda52c72d51988aa19defea0ab7483507a57a Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:40:00 -0500 Subject: [PATCH 026/239] Refactor selectors to use includes --- middleware/policy.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index 0badca9652f..e310fcca9a7 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -37,10 +37,10 @@ test.only ("Content-Security-Policy: style-src 'none'", async t => { const server = (new Server).serve `` , response = await fetch ('http://localhost:8181/') + , policy = response.headers.get ('content-security-policy') - t.ok - (response.headers.get ('content-security-policy').includes `style-src 'none'`) + t.ok ( policy.includes `style-src 'none'` ) server.close `` t.end () From 4cfc6acded6e46d47a01d66e2934bc14461796a6 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:45:37 -0500 Subject: [PATCH 027/239] Refactor policies --- middleware/policy.es | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 14ac289e9ec..7ec678403a0 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -1,7 +1,15 @@ const - policies = [ - `default-src 'none'` // `default-src 'self' https://${domain};` - , `style-src 'none'` // `style-src 'self' 'unsafe-inline' https://cdn.example.com + defaults + // `default-src 'self' https://${domain};` + = [`'none'`] + +, styles + // `style-src 'self' 'unsafe-inline' https://cdn.example.com + = [`'none'`] + +, policies = [ + , `default-src ${ defaults.join ` ` };` + , `style-src ${ styles.join ` ` };` ] From 90dbef2c1b2eddac1cd639f8a7e7d92290d3038f Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:49:07 -0500 Subject: [PATCH 028/239] Remove unnecessary semi-colon --- middleware/policy.es | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/policy.es b/middleware/policy.es index 7ec678403a0..75f037a7c15 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -20,5 +20,5 @@ module.exports = options => await next () context.set - ( 'Content-Security-Policy', policies.join `; ` ) + ( 'Content-Security-Policy', policies.join ` ` ) } From d60fa9573f7ee47b8fb954d3a0130a171c142bc8 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:51:41 -0500 Subject: [PATCH 029/239] Add spec for Content-Security-Policy: frame-src --- middleware/policy.es | 5 +++++ middleware/policy.test | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 75f037a7c15..1f58eafe28a 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -3,12 +3,17 @@ const // `default-src 'self' https://${domain};` = [`'none'`] +, frames + // `frame-src 'self' https://${domain};` + = [`'none'`] + , styles // `style-src 'self' 'unsafe-inline' https://cdn.example.com = [`'none'`] , policies = [ , `default-src ${ defaults.join ` ` };` + , `frame-src ${ frames.join ` ` };` , `style-src ${ styles.join ` ` };` ] diff --git a/middleware/policy.test b/middleware/policy.test index e310fcca9a7..8bc1b7cd805 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -27,12 +27,26 @@ test ("Content-Security-Policy: default-src 'none'", async t => { }) -test ("Content-Security-Policy: frame-src 'self'") +test.only ("Content-Security-Policy: frame-src 'self'", async t => { + + const + server = (new Server).serve `` + , response = await fetch ('http://localhost:8181/') + , policy = response.headers.get ('content-security-policy') + + + t.ok ( policy.includes `frame-src 'none'` ) + + server.close `` + t.end () +}) + + test ("Content-Security-Policy: connect-src 'self'") test ("Content-Security-Policy: img-src 'self' https://cdn.example.com") -test.only ("Content-Security-Policy: style-src 'none'", async t => { +test ("Content-Security-Policy: style-src 'none'", async t => { const server = (new Server).serve `` From 5d2cd0af75fa1b116aa9de80307d5eb69f7f52e8 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:55:26 -0500 Subject: [PATCH 030/239] Add spec for Content-Security-Policy: connect-src --- middleware/policy.es | 5 +++++ middleware/policy.test | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 1f58eafe28a..cd33830b7a4 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -11,9 +11,14 @@ const // `style-src 'self' 'unsafe-inline' https://cdn.example.com = [`'none'`] +, connects + // `connect-src 'self' https://${domain};` + = [`'none'`] + , policies = [ , `default-src ${ defaults.join ` ` };` , `frame-src ${ frames.join ` ` };` + , `connect-src ${ connects.join ` ` };` , `style-src ${ styles.join ` ` };` ] diff --git a/middleware/policy.test b/middleware/policy.test index 8bc1b7cd805..c34c5a6b969 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -27,7 +27,7 @@ test ("Content-Security-Policy: default-src 'none'", async t => { }) -test.only ("Content-Security-Policy: frame-src 'self'", async t => { +test ("Content-Security-Policy: frame-src 'self'", async t => { const server = (new Server).serve `` @@ -42,7 +42,21 @@ test.only ("Content-Security-Policy: frame-src 'self'", async t => { }) -test ("Content-Security-Policy: connect-src 'self'") +test.only ("Content-Security-Policy: connect-src 'self'", async t => { + + const + server = (new Server).serve `` + , response = await fetch ('http://localhost:8181/') + , policy = response.headers.get ('content-security-policy') + + + t.ok ( policy.includes `connect-src 'none'` ) + + server.close `` + t.end () +}) + + test ("Content-Security-Policy: img-src 'self' https://cdn.example.com") From 6e59c347af740b9516de45f4c53615f6c547f805 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 15:58:38 -0500 Subject: [PATCH 031/239] Add spec for Content-Security-Policy: img-src --- middleware/policy.es | 5 +++++ middleware/policy.test | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index cd33830b7a4..29e56c2108a 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -15,10 +15,15 @@ const // `connect-src 'self' https://${domain};` = [`'none'`] +, images + // `image-src 'self' https://cdn.example.com + = [`'none'`] + , policies = [ , `default-src ${ defaults.join ` ` };` , `frame-src ${ frames.join ` ` };` , `connect-src ${ connects.join ` ` };` + , `img-src ${ images.join ` ` };` , `style-src ${ styles.join ` ` };` ] diff --git a/middleware/policy.test b/middleware/policy.test index c34c5a6b969..a6e2e00f45b 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -42,7 +42,7 @@ test ("Content-Security-Policy: frame-src 'self'", async t => { }) -test.only ("Content-Security-Policy: connect-src 'self'", async t => { +test ("Content-Security-Policy: connect-src 'self'", async t => { const server = (new Server).serve `` @@ -57,7 +57,20 @@ test.only ("Content-Security-Policy: connect-src 'self'", async t => { }) -test ("Content-Security-Policy: img-src 'self' https://cdn.example.com") +test.only ("Content-Security-Policy: img-src 'self'", async t => { + + const + server = (new Server).serve `` + , response = await fetch ('http://localhost:8181/') + , policy = response.headers.get ('content-security-policy') + + + t.ok ( policy.includes `img-src 'none'` ) + + server.close `` + t.end () +}) + test ("Content-Security-Policy: style-src 'none'", async t => { From 28ad745539ae899c5fde92ef6471cc108c14a4f1 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 16:02:45 -0500 Subject: [PATCH 032/239] Add spec for Content-Security-Policy: script-src --- middleware/policy.es | 15 ++++++++++----- middleware/policy.test | 19 +++++++++++++++---- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 29e56c2108a..34083a223cc 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -7,10 +7,6 @@ const // `frame-src 'self' https://${domain};` = [`'none'`] -, styles - // `style-src 'self' 'unsafe-inline' https://cdn.example.com - = [`'none'`] - , connects // `connect-src 'self' https://${domain};` = [`'none'`] @@ -19,12 +15,21 @@ const // `image-src 'self' https://cdn.example.com = [`'none'`] +, styles + // `style-src 'self' 'unsafe-inline' https://cdn.example.com + = [`'none'`] + +, scripts + // `style-src 'self' https://cdn.example.com + = [`'none'`] + , policies = [ - , `default-src ${ defaults.join ` ` };` + `default-src ${ defaults.join ` ` };` , `frame-src ${ frames.join ` ` };` , `connect-src ${ connects.join ` ` };` , `img-src ${ images.join ` ` };` , `style-src ${ styles.join ` ` };` + , `script-src ${ scripts.join ` ` };` ] diff --git a/middleware/policy.test b/middleware/policy.test index a6e2e00f45b..8a9995e52fb 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -57,10 +57,10 @@ test ("Content-Security-Policy: connect-src 'self'", async t => { }) -test.only ("Content-Security-Policy: img-src 'self'", async t => { +test ("content-security-policy: img-src 'self'", async t => { const - server = (new Server).serve `` + server = (new server).serve `` , response = await fetch ('http://localhost:8181/') , policy = response.headers.get ('content-security-policy') @@ -72,7 +72,6 @@ test.only ("Content-Security-Policy: img-src 'self'", async t => { }) - test ("Content-Security-Policy: style-src 'none'", async t => { const @@ -88,4 +87,16 @@ test ("Content-Security-Policy: style-src 'none'", async t => { }) -test ("Content-Security-Policy: script-src 'self'") +test.only ("Content-Security-Policy: script-src 'self'", async t => { + + const + server = (new Server).serve `` + , response = await fetch ('http://localhost:8181/') + , policy = response.headers.get ('content-security-policy') + + + t.ok ( policy.includes `script-src 'none'` ) + + server.close `` + t.end () +}) From bf2fbc2aaed58e21cff7929cc7667cbbea147b49 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 16:03:36 -0500 Subject: [PATCH 033/239] Remove bug from lowercased variable name --- middleware/policy.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/policy.test b/middleware/policy.test index 8a9995e52fb..9daf3916ab6 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -60,7 +60,7 @@ test ("Content-Security-Policy: connect-src 'self'", async t => { test ("content-security-policy: img-src 'self'", async t => { const - server = (new server).serve `` + server = (new Server).serve `` , response = await fetch ('http://localhost:8181/') , policy = response.headers.get ('content-security-policy') From fb6951dd822e7be5f645d7cba26743c5ecfc9100 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 16:03:42 -0500 Subject: [PATCH 034/239] Remove only test --- middleware/policy.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/policy.test b/middleware/policy.test index 9daf3916ab6..b49c5891f48 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -87,7 +87,7 @@ test ("Content-Security-Policy: style-src 'none'", async t => { }) -test.only ("Content-Security-Policy: script-src 'self'", async t => { +test ("Content-Security-Policy: script-src 'self'", async t => { const server = (new Server).serve `` From fa67d6dd5cb19014bddce5388bcb35f8ba074ebb Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 16:07:12 -0500 Subject: [PATCH 035/239] Fix scripts policy comment --- middleware/policy.es | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/policy.es b/middleware/policy.es index 34083a223cc..18bdb179b2a 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -20,7 +20,7 @@ const = [`'none'`] , scripts - // `style-src 'self' https://cdn.example.com + // `scripts-src 'self' https://cdn.example.com = [`'none'`] , policies = [ From 36ff06a6c46c4f11c25f708005f55e59b0386e90 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 16:07:37 -0500 Subject: [PATCH 036/239] Add spec for Content-Security-Policy: report-uri --- middleware/policy.es | 7 ++++++- middleware/policy.test | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 18bdb179b2a..36b02cddc0d 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -1,4 +1,8 @@ const + reports + // `reports-src 'self' https://${domain};` + = [`'none'`] + defaults // `default-src 'self' https://${domain};` = [`'none'`] @@ -24,7 +28,8 @@ const = [`'none'`] , policies = [ - `default-src ${ defaults.join ` ` };` + `report-uri ${ reports.join ` ` };` + , `default-src ${ defaults.join ` ` };` , `frame-src ${ frames.join ` ` };` , `connect-src ${ connects.join ` ` };` , `img-src ${ images.join ` ` };` diff --git a/middleware/policy.test b/middleware/policy.test index b49c5891f48..3ef4a0c96f8 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -9,7 +9,21 @@ const test ('calling next middleware') -test ("Content-Security-Policy: report-uri 'self'") +test ("Content-Security-Policy: report-uri 'none'", async t => { + + const + server = (new Server).serve `` + , response = await fetch ('http://localhost:8181/') + , policy = response.headers.get ('content-security-policy') + + + t.ok ( policy.includes `report-uri 'none'` ) + + server.close `` + t.end () +}) + + test ("Content-Security-Policy: default-src 'none'", async t => { From 6084bf222b623c7a3d35f918521a94514c3c19c5 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 16:09:25 -0500 Subject: [PATCH 037/239] Convert from self to none in Content-Security-Policy test descriptions --- middleware/policy.test | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index 3ef4a0c96f8..1558e9be16c 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -41,7 +41,7 @@ test ("Content-Security-Policy: default-src 'none'", async t => { }) -test ("Content-Security-Policy: frame-src 'self'", async t => { +test ("Content-Security-Policy: frame-src 'none'", async t => { const server = (new Server).serve `` @@ -56,7 +56,7 @@ test ("Content-Security-Policy: frame-src 'self'", async t => { }) -test ("Content-Security-Policy: connect-src 'self'", async t => { +test ("Content-Security-Policy: connect-src 'none'", async t => { const server = (new Server).serve `` @@ -71,7 +71,7 @@ test ("Content-Security-Policy: connect-src 'self'", async t => { }) -test ("content-security-policy: img-src 'self'", async t => { +test ("content-security-policy: img-src 'none'", async t => { const server = (new Server).serve `` @@ -101,7 +101,7 @@ test ("Content-Security-Policy: style-src 'none'", async t => { }) -test ("Content-Security-Policy: script-src 'self'", async t => { +test ("Content-Security-Policy: script-src 'none'", async t => { const server = (new Server).serve `` From 1cd371bf46f8bece52287ce7e0be46c2bf258394 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 16:11:13 -0500 Subject: [PATCH 038/239] Fix comments for Content-Security-Policy middleware implementation --- middleware/policy.es | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 36b02cddc0d..d06d9080b3e 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -16,15 +16,15 @@ const = [`'none'`] , images - // `image-src 'self' https://cdn.example.com + // `image-src 'self' data: https://cdn.example.com` = [`'none'`] , styles - // `style-src 'self' 'unsafe-inline' https://cdn.example.com + // `style-src 'self' 'unsafe-inline' https://cdn.example.com` = [`'none'`] , scripts - // `scripts-src 'self' https://cdn.example.com + // `scripts-src 'self' https://cdn.example.com` = [`'none'`] , policies = [ From 1e7b8e50c851dc723c7b21212717e3a5e10766aa Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 19 Jan 2018 16:13:16 -0500 Subject: [PATCH 039/239] Add test for script nonce --- middleware/policy.es | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/middleware/policy.es b/middleware/policy.es index d06d9080b3e..8777a699479 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -24,7 +24,8 @@ const = [`'none'`] , scripts - // `scripts-src 'self' https://cdn.example.com` + // Script Nonce for inline + From bb00739cab42ddef575d55b52ed3dfda60053515 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 01:29:42 -0400 Subject: [PATCH 223/239] Refactor test for Content-Security-Policy-Report-Only --- middleware/policy.es | 20 +++++++++++--------- middleware/policy.test | 9 +++++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 5c65a578cb5..b1d4ef41056 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -1,11 +1,9 @@ // Can actually charge for this feature // https://report-uri.com/#prices -let - header = 'Content-Security-Policy' - const //schemes = ['safari-extension://', 'chrome-extension://', 'https://', 'http://'] - SECURE = true + header = 'Content-Security-Policy' +, SECURE = true // Depending on analytics framework, // may want to listen for securitypolicyviolation events // with JavaScript and collect more information about the client before reporting. @@ -91,13 +89,17 @@ const ] -module.exports = async (context, next) => { +module.exports = async (context, next, policy) => { + + policy = directives.filter (Boolean).join `; ` - // Is this a security breach? Will someone be able to disable CSP with this? - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only - 'report' in context.request.query && (header += '-Report-Only') + context.set ( header, policy) - context.set ( header, directives.filter (Boolean).join `; ` ) + 'report' + // Is this a security breach? Will someone be able to disable CSP with this? + in context.request.query + && context.set + ( `${header}-Report-Only`, policy) await next (context) } diff --git a/middleware/policy.test b/middleware/policy.test index aca1fef85c3..3405d67a236 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -19,12 +19,13 @@ test.only ('Content-Security-Policy-Report-Only', async t => { , { headers } = await fetch ('http://localhost:8181/?report') + , policy = headers.get ('Content-Security-Policy') + , report = headers.get ('Content-Security-Policy-Report-Only') - t.notOk - ( headers.get ('Content-Security-Policy') ) - t.ok - ( headers.get ('Content-Security-Policy-Report-Only') ) + t.ok ( policy ) + t.ok ( report ) + t.equals ( policy, report ) server.close `` t.end () From 6c5d1c1d77824a0cc9cfed75b3822c39b51380b7 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 01:35:14 -0400 Subject: [PATCH 224/239] Assert Content-Security-Policy-Report-Only does not exist without querystring parameter ?report --- middleware/policy.test | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index 3405d67a236..b930ab25aa8 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -16,16 +16,24 @@ test.only ('Content-Security-Policy-Report-Only', async t => { const server = serve `` - , { headers } - = await fetch ('http://localhost:8181/?report') - - , policy = headers.get ('Content-Security-Policy') - , report = headers.get ('Content-Security-Policy-Report-Only') + let headers, policy, report + headers = (await fetch ('http://localhost:8181/?report')).headers + report = headers.get ('Content-Security-Policy-Report-Only') + policy = headers.get ('Content-Security-Policy') + t.equals ( policy, report ) t.ok ( policy ) t.ok ( report ) - t.equals ( policy, report ) + + + headers = (await fetch ('http://localhost:8181/')).headers + report = headers.get ('Content-Security-Policy-Report-Only') + policy = headers.get ('Content-Security-Policy') + + t.ok ( policy ) + t.notOk ( report ) + t.notEquals ( policy, report ) server.close `` t.end () From d29db84a2744f7979d4f6a036cffa64dcde7a730 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 01:35:35 -0400 Subject: [PATCH 225/239] Refactor policy.es --- middleware/policy.es | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index b1d4ef41056..38fe269d5b2 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -96,10 +96,8 @@ module.exports = async (context, next, policy) => { context.set ( header, policy) 'report' - // Is this a security breach? Will someone be able to disable CSP with this? in context.request.query - && context.set - ( `${header}-Report-Only`, policy) + && context.set ( `${header}-Report-Only`, policy) await next (context) } From 6428879dddcdd542ec5c59b44ef7399640c75051 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 01:38:25 -0400 Subject: [PATCH 226/239] Refactor Content-Security-Policy-Report-Only test --- middleware/policy.test | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index b930ab25aa8..9a54697dcd7 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -16,15 +16,16 @@ test.only ('Content-Security-Policy-Report-Only', async t => { const server = serve `` - let headers, policy, report + let + headers, policy, report headers = (await fetch ('http://localhost:8181/?report')).headers report = headers.get ('Content-Security-Policy-Report-Only') policy = headers.get ('Content-Security-Policy') - t.equals ( policy, report ) t.ok ( policy ) t.ok ( report ) + t.equals ( policy, report ) headers = (await fetch ('http://localhost:8181/')).headers From 5415743f994cc57d0ed38f5238672b762eb3bacc Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 21:15:54 -0400 Subject: [PATCH 227/239] Add report/README.md --- report/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 report/README.md diff --git a/report/README.md b/report/README.md new file mode 100644 index 00000000000..dc5856315f3 --- /dev/null +++ b/report/README.md @@ -0,0 +1,8 @@ +# Report + + Used for violation reporting. + + +## Example JSON Payload + + See [index.json](index.json) From 53fddfba9be87cc82dda4667397a3f21fd5533f0 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 21:16:51 -0400 Subject: [PATCH 228/239] Add MDN link --- report/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/report/README.md b/report/README.md index dc5856315f3..2278c370179 100644 --- a/report/README.md +++ b/report/README.md @@ -2,6 +2,8 @@ Used for violation reporting. + See [MDN Violation Report Syntax](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP#Violation_report_syntax) For further details. + ## Example JSON Payload From 3199f37af3e70b14b0cd0176c6110167ae070183 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 21:18:19 -0400 Subject: [PATCH 229/239] Add report/index.json --- report/index.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 report/index.json diff --git a/report/index.json b/report/index.json new file mode 100644 index 00000000000..ffcd4415b08 --- /dev/null +++ b/report/index.json @@ -0,0 +1 @@ +{ } From 033e3800219eccc51e76b7cf36727658ae484e1e Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 21:23:20 -0400 Subject: [PATCH 230/239] Add sample csp report for report resource --- report/index.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/report/index.json b/report/index.json index ffcd4415b08..8bb9f109f09 100644 --- a/report/index.json +++ b/report/index.json @@ -1 +1,9 @@ -{ } +{ + "csp-report": { + "document-uri": "http://example.com/", + "referrer": "", + "blocked-uri": "http://example.com/index.css", + "violated-directive": "style-src foo.com", + "original-policy": "default-src 'none'; style-src foo.com; report-uri /reports/" + } +} From a33c3b56282e8fa9a60cc4771dcf1b8dbb5a77dd Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 23:41:51 -0400 Subject: [PATCH 231/239] Add Report resource to server --- bin/serve.es | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/serve.es b/bin/serve.es index 50942461de4..edf8f80846c 100644 --- a/bin/serve.es +++ b/bin/serve.es @@ -6,6 +6,7 @@ const = require ('../middleware') middleware = [ + route (`/report/`, Resource `/report/`) route (`/hello/`, Resource `/resource/fixtures/`) , route (`/examples/`, Resource `/examples/`) ] From c4a3610aed75cdb53ce7ccb93d8e230834e633d5 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Tue, 3 Jul 2018 23:42:32 -0400 Subject: [PATCH 232/239] Fix bug with routing system --- bin/serve.es | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/serve.es b/bin/serve.es index edf8f80846c..7c93f26dc35 100644 --- a/bin/serve.es +++ b/bin/serve.es @@ -7,7 +7,7 @@ const middleware = [ route (`/report/`, Resource `/report/`) - route (`/hello/`, Resource `/resource/fixtures/`) +, route (`/hello/`, Resource `/resource/fixtures/`) , route (`/examples/`, Resource `/examples/`) ] From ed9da82e1965c82453515c82384cd77157aec04f Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 6 Jul 2018 00:10:00 -0400 Subject: [PATCH 233/239] Migrate color palette and style comments to prevent CSP error --- index.css | 6 +++++- index.html | 2 -- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/index.css b/index.css index 9e0acdec87e..946b80710e5 100644 --- a/index.css +++ b/index.css @@ -1,3 +1,8 @@ +/* + // enough inline styles to paint to fold + // Japanese colors - https://en.wikipedia.org/wiki/Traditional_colors_of_Japan#Red.2FViolet_series +*/ + :root { --margin: 0 0; } @@ -271,4 +276,3 @@ body > main, body > aside { flex: 1 } } @media (min-width:1300px) { } - diff --git a/index.html b/index.html index 984c309c010..afff2445d70 100644 --- a/index.html +++ b/index.html @@ -33,8 +33,6 @@ From fbfff4474da17f714c0d5114572c0005b9290b30 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 6 Jul 2018 00:11:20 -0400 Subject: [PATCH 234/239] Remove legacy style tag --- index.html | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/index.html b/index.html index afff2445d70..c3fcc8b3b62 100644 --- a/index.html +++ b/index.html @@ -16,6 +16,7 @@ href=/index.css rel='preload stylesheet' > + - - - From e1b761bf4d1dd12bdd62d6a977a63617aa747e01 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 6 Jul 2018 00:35:18 -0400 Subject: [PATCH 235/239] Create specification for child-src as per Changes in CSP3 References: - https://www.w3.org/TR/CSP/#changes-from-level-2 --- middleware/policy.es | 4 +++- middleware/policy.test | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/middleware/policy.es b/middleware/policy.es index 38fe269d5b2..215c73d2d83 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -22,7 +22,8 @@ const , font = defaults // font-src , media = defaults // media-src , connect = defaults // connect-src -, frame = defaults // frame-src // *DEPRECATED* child-src fallback +, child = defaults // child-src +, frame = child // frame-src , worker = script // worker-src // script-src fallback , object = ["'none'"] // object-src , plugin = ['audio/*', 'video/*'] // plugin-types when object != 'none' @@ -58,6 +59,7 @@ const , `font-src ${ font.join ` ` }` , `media-src ${ media.join ` ` }` , `connect-src ${ connect.join ` ` }` + , `child-src ${ child.join ` ` }` , `frame-src ${ frame.join ` ` }` , `worker-src ${ worker.join ` ` }` , `object-src ${ object.join ` ` }` diff --git a/middleware/policy.test b/middleware/policy.test index 9a54697dcd7..90c859f663c 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -11,7 +11,7 @@ const test ('calling next middleware') -test.only ('Content-Security-Policy-Report-Only', async t => { +test ('Content-Security-Policy-Report-Only', async t => { const server = serve `` @@ -77,6 +77,23 @@ test ('Content-Security-Policy: default-src', async t => { }) +test.only ('Content-Security-Policy: child-src', async t => { + + const + server = (new Server).serve `` + + , policy + = (await fetch ('http://localhost:8181/')) + .headers.get ('content-security-policy') + + + t.ok ( policy.includes (`child-src ${defaults}`) ) + + server.close `` + t.end () +}) + + test ('Content-Security-Policy: frame-src', async t => { const From 33e1ffe9284c3c336718558529593e7d5e1f8f4f Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 6 Jul 2018 00:41:27 -0400 Subject: [PATCH 236/239] Create specification for manifest-src as per Changes in CSP3 References: - https://www.w3.org/TR/CSP/#directive-manifest-src --- middleware/policy.es | 2 ++ middleware/policy.test | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/middleware/policy.es b/middleware/policy.es index 215c73d2d83..8e13db8c7c5 100644 --- a/middleware/policy.es +++ b/middleware/policy.es @@ -31,6 +31,7 @@ const , form = defaults // form-action , ancestors = defaults // frame-ancestors +, manifest = defaults // manifest-src , base = defaults // base-uri , sandbox = defaults ||// sandbox [/* @@ -73,6 +74,7 @@ const // Document , `base-uri ${ base.join ` ` }` + , `manifest-src ${ manifest.join ` ` }` // `sandbox ...` is not supported in the element // or by the Content-Security-policy-Report-Only header field. // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/sandbox diff --git a/middleware/policy.test b/middleware/policy.test index 90c859f663c..a68fbae1f05 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -77,7 +77,24 @@ test ('Content-Security-Policy: default-src', async t => { }) -test.only ('Content-Security-Policy: child-src', async t => { +test.only ('Content-Security-Policy: manifest-src', async t => { + + const + server = (new Server).serve `` + + , policy + = (await fetch ('http://localhost:8181/')) + .headers.get ('content-security-policy') + + + t.ok ( policy.includes (`manifest-src ${defaults}`) ) + + server.close `` + t.end () +}) + + +test ('Content-Security-Policy: child-src', async t => { const server = (new Server).serve `` From 327f404c6963a8b8bbbdc1ffb75e4ee017718755 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 13 Jul 2018 22:53:46 -0400 Subject: [PATCH 237/239] Refactor Content-Security-Policy-Report-Only --- middleware/policy.test | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index a68fbae1f05..a2b364ca165 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -11,21 +11,24 @@ const test ('calling next middleware') -test ('Content-Security-Policy-Report-Only', async t => { +test.only ('Content-Security-Policy-Report-Only', async t => { const server = serve `` let - headers, policy, report + policy, report - headers = (await fetch ('http://localhost:8181/?report')).headers - report = headers.get ('Content-Security-Policy-Report-Only') - policy = headers.get ('Content-Security-Policy') + , { headers } + = (await fetch ('http://localhost:8181/?report')) + + report = headers.get ('Content-Security-Policy-Report-Only') + policy = headers.get ('Content-Security-Policy') t.ok ( policy ) t.ok ( report ) - t.equals ( policy, report ) + t.equals ( report, policy ) + headers = (await fetch ('http://localhost:8181/')).headers @@ -34,7 +37,6 @@ test ('Content-Security-Policy-Report-Only', async t => { t.ok ( policy ) t.notOk ( report ) - t.notEquals ( policy, report ) server.close `` t.end () @@ -77,10 +79,10 @@ test ('Content-Security-Policy: default-src', async t => { }) -test.only ('Content-Security-Policy: manifest-src', async t => { +test ('Content-Security-Policy: manifest-src', async t => { const - server = (new Server).serve `` + server = serve `` , policy = (await fetch ('http://localhost:8181/')) From 9a1e9b504ffddb7f0e157460863f38e689f7e207 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 13 Jul 2018 22:57:14 -0400 Subject: [PATCH 238/239] Refactor Content-Security-Policy-Report-Only and Content-Security-Policy into separate specs --- middleware/policy.test | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/middleware/policy.test b/middleware/policy.test index a2b364ca165..1200ac1778d 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -11,29 +11,36 @@ const test ('calling next middleware') -test.only ('Content-Security-Policy-Report-Only', async t => { +test ('Content-Security-Policy-Report-Only', async t => { const server = serve `` - let - policy, report - , { headers } = (await fetch ('http://localhost:8181/?report')) - report = headers.get ('Content-Security-Policy-Report-Only') - policy = headers.get ('Content-Security-Policy') + , report = headers.get ('Content-Security-Policy-Report-Only') + , policy = headers.get ('Content-Security-Policy') t.ok ( policy ) t.ok ( report ) t.equals ( report, policy ) + server.close `` + t.end () +}) + + +test.only ('Content-Security-Policy', async t => { + const + server = serve `` + + , { headers } + = (await fetch ('http://localhost:8181/')) - headers = (await fetch ('http://localhost:8181/')).headers - report = headers.get ('Content-Security-Policy-Report-Only') - policy = headers.get ('Content-Security-Policy') + , report = headers.get ('Content-Security-Policy-Report-Only') + , policy = headers.get ('Content-Security-Policy') t.ok ( policy ) t.notOk ( report ) From 2c78d0297c93c690ddc53a10d690b4363617f510 Mon Sep 17 00:00:00 2001 From: Snuggs Date: Fri, 13 Jul 2018 22:58:06 -0400 Subject: [PATCH 239/239] Remove only test --- middleware/policy.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/policy.test b/middleware/policy.test index 1200ac1778d..917e407707c 100644 --- a/middleware/policy.test +++ b/middleware/policy.test @@ -31,7 +31,7 @@ test ('Content-Security-Policy-Report-Only', async t => { }) -test.only ('Content-Security-Policy', async t => { +test ('Content-Security-Policy', async t => { const server = serve ``