Merge pull request #307 from AlexanderZeilmann/master
Add security headers - fixes #304
This commit is contained in:
		| @@ -58,6 +58,7 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea | ||||
| - Newsletter component with support for mailchimp, buttondown, convertkit and klaviyo | ||||
| - Supports [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus | ||||
| - Projects page | ||||
| - Preconfigured security headers | ||||
| - SEO friendly with RSS feed, sitemaps and more! | ||||
|  | ||||
| ## Sample posts | ||||
| @@ -134,7 +135,9 @@ You can start editing the page by modifying `pages/index.js`. The page auto-upda | ||||
|  | ||||
| `layouts` - main templates used in pages. | ||||
|  | ||||
| `pages` - pages to route to. Read the [Next.js documentation](https://nextjs.org/docs) for more information | ||||
| `pages` - pages to route to. Read the [Next.js documentation](https://nextjs.org/docs) for more information. | ||||
|  | ||||
| `next.config.js` - configuration related to Next.js. You need to adapt the Content Security Policy if you want to load scripts, images etc. from other domains. | ||||
|  | ||||
| ## Post | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| --- | ||||
| title: 'Introducing Tailwind Nextjs Starter Blog' | ||||
| date: '2021-01-12' | ||||
| lastmod: '2021-12-15' | ||||
| lastmod: '2021-12-22' | ||||
| tags: ['next-js', 'tailwind', 'guide'] | ||||
| draft: false | ||||
| summary: 'Looking for a performant, out of the box template, with all the best in web technology to support your blogging needs? Checkout the Tailwind Nextjs Starter Blog template.' | ||||
| @@ -62,6 +62,7 @@ I wanted it to be nearly as feature-rich as popular blogging templates like [bea | ||||
| - Newsletter component with support for mailchimp, buttondown and convertkit | ||||
| - Supports [giscus](https://github.com/laymonage/giscus), [utterances](https://github.com/utterance/utterances) or disqus | ||||
| - Projects page | ||||
| - Preconfigured security headers | ||||
| - SEO friendly with RSS feed, sitemaps and more! | ||||
|  | ||||
| ## Sample posts | ||||
| @@ -123,7 +124,9 @@ You can start editing the page by modifying `pages/index.js`. The page auto-upda | ||||
|  | ||||
| `layouts` - main templates used in pages. | ||||
|  | ||||
| `pages` - pages to route to. Read the [Next.js documentation](https://nextjs.org/docs) for more information | ||||
| `pages` - pages to route to. Read the [Next.js documentation](https://nextjs.org/docs) for more information. | ||||
|  | ||||
| `next.config.js` - configuration related to Next.js. You need to adapt the Content Security Policy if you want to load scripts, images etc. from other domains. | ||||
|  | ||||
| ## Post | ||||
|  | ||||
|   | ||||
| @@ -2,12 +2,69 @@ const withBundleAnalyzer = require('@next/bundle-analyzer')({ | ||||
|   enabled: process.env.ANALYZE === 'true', | ||||
| }) | ||||
|  | ||||
| // You might need to insert additional domains in script-src if you are using external services | ||||
| const ContentSecurityPolicy = ` | ||||
|   default-src 'self'; | ||||
|   script-src 'self' 'unsafe-eval' 'unsafe-inline'; | ||||
|   style-src 'self' 'unsafe-inline' *.googleapis.com cdn.jsdelivr.net; | ||||
|   img-src * blob: data:; | ||||
|   media-src 'none'; | ||||
|   connect-src *; | ||||
|   font-src 'self' fonts.gstatic.com cdn.jsdelivr.net; | ||||
| ` | ||||
|  | ||||
| const securityHeaders = [ | ||||
|   // https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | ||||
|   { | ||||
|     key: 'Content-Security-Policy', | ||||
|     value: ContentSecurityPolicy.replace(/\n/g, ''), | ||||
|   }, | ||||
|   // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy | ||||
|   { | ||||
|     key: 'Referrer-Policy', | ||||
|     value: 'strict-origin-when-cross-origin', | ||||
|   }, | ||||
|   // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options | ||||
|   { | ||||
|     key: 'X-Frame-Options', | ||||
|     value: 'DENY', | ||||
|   }, | ||||
|   // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options | ||||
|   { | ||||
|     key: 'X-Content-Type-Options', | ||||
|     value: 'nosniff', | ||||
|   }, | ||||
|   // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-DNS-Prefetch-Control | ||||
|   { | ||||
|     key: 'X-DNS-Prefetch-Control', | ||||
|     value: 'on', | ||||
|   }, | ||||
|   // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security | ||||
|   { | ||||
|     key: 'Strict-Transport-Security', | ||||
|     value: 'max-age=31536000; includeSubDomains; preload', | ||||
|   }, | ||||
|   // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy | ||||
|   { | ||||
|     key: 'Permissions-Policy', | ||||
|     value: 'camera=(), microphone=(), geolocation=()', | ||||
|   }, | ||||
| ] | ||||
|  | ||||
| module.exports = withBundleAnalyzer({ | ||||
|   reactStrictMode: true, | ||||
|   pageExtensions: ['js', 'jsx', 'md', 'mdx'], | ||||
|   eslint: { | ||||
|     dirs: ['pages', 'components', 'lib', 'layouts', 'scripts'], | ||||
|   }, | ||||
|   async headers() { | ||||
|     return [ | ||||
|       { | ||||
|         source: '/(.*)', | ||||
|         headers: securityHeaders, | ||||
|       }, | ||||
|     ] | ||||
|   }, | ||||
|   webpack: (config, { dev, isServer }) => { | ||||
|     config.module.rules.push({ | ||||
|       test: /\.(png|jpe?g|gif|mp4)$/i, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user