WIP: Send nonce in CSP
This commit is contained in:
		
							
								
								
									
										9
									
								
								packages/backend/src/@types/fastify.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								packages/backend/src/@types/fastify.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | import FastifyReply from "fastify"; | ||||||
|  |  | ||||||
|  | declare module 'fastify' { | ||||||
|  |   interface FastifyReply { | ||||||
|  |     cspNonce: { | ||||||
|  |         script: string | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -1,5 +1,6 @@ | |||||||
| import { dirname } from 'node:path'; | import { dirname } from 'node:path'; | ||||||
| import { fileURLToPath } from 'node:url'; | import { fileURLToPath } from 'node:url'; | ||||||
|  | import { randomBytes } from 'node:crypto'; | ||||||
| import { Inject, Injectable } from '@nestjs/common'; | import { Inject, Injectable } from '@nestjs/common'; | ||||||
| import { createBullBoard } from '@bull-board/api'; | import { createBullBoard } from '@bull-board/api'; | ||||||
| import { BullAdapter } from '@bull-board/api/bullAdapter.js'; | import { BullAdapter } from '@bull-board/api/bullAdapter.js'; | ||||||
| @@ -174,12 +175,16 @@ export class ClientServerService { | |||||||
| 			reply.header('X-Frame-Options', 'DENY'); | 			reply.header('X-Frame-Options', 'DENY'); | ||||||
|  |  | ||||||
| 			// XSSが存在した場合に影響を軽減する | 			// XSSが存在した場合に影響を軽減する | ||||||
| 			// (script-srcにunsafe-inline等を追加すると意味が無くなるので注意) | 			// (インラインスクリプトはreply.cspNonce内の値をnonce属性に設定することで使える) | ||||||
|  | 			const scriptNonce = randomBytes(16).toString('hex'); | ||||||
|  | 			reply.cspNonce = { | ||||||
|  | 				script: scriptNonce, | ||||||
|  | 			}; | ||||||
| 			const csp = this.config.contentSecurityPolicy | 			const csp = this.config.contentSecurityPolicy | ||||||
| 				?? 'script-src \'self\' ' + | 				?? 'script-src \'self\' ' + | ||||||
| 				'https://challenges.cloudflare.com https://hcaptcha.com https://*.hcaptcha.com https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ https://www.recaptcha.net/recaptcha/; ' + | 				'https://challenges.cloudflare.com https://hcaptcha.com https://*.hcaptcha.com https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/ https://www.recaptcha.net/recaptcha/ {scriptNonce}; ' + | ||||||
| 				'base-uri \'self\'; object-src \'self\'; report-uri /csp-error'; | 				'base-uri \'self\'; object-src \'self\'; report-uri /csp-error'; | ||||||
| 			reply.header('Content-Security-Policy-Report-Only', csp); | 			reply.header('Content-Security-Policy-Report-Only', csp.replace('{scriptNonce}', `'nonce-${scriptNonce}'`)); | ||||||
| 			done(); | 			done(); | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Ry0taK
					Ry0taK