2024年8月28日 星期三

用 Spring-boot 處理內容安全策略(Content-Security-Policy)的報告時遇到的坑

這邊記錄一下我在 spring-boot 中,處理 CSP 的 CSP report 遇到的坑

Report URI 會出現 HTTP 415

我這邊的 CSP 有設定 CSP report 的 request 是 /csp-report ,如下:

Content-Security-Policy: default-src 'self'; report-uri /csp-report

可當觸發了 CSP 時,/csp-report的 request 都會是 HTTP 415 Unsupported Media Type

而 spring 的 log 則如下:

2020-01-01 15:04:05.067 [http-nio-80-exec-10][DEBUG][o.s.web.servlet.DispatcherServlet] GET "/csp-report", parameters={}
2020-01-01 15:04:05.072 [http-nio-80-exec-10][DEBUG][o.s.web.servlet.DispatcherServlet] Completed 415 UNSUPPORTED_MEDIA_TYPE

後來查了一下,是因為 CSP report 的 content-type 為 application/csp-report(詳見 MDN 《CSP: report-uri》中,Violation report syntax 章節)。

而 spring 的 Mime type list 是沒有這個的,得自行手動加上。

要加上得自己新增一個 Bean :

@Configuration
public class MimeTypeConfig {
	@Bean
	public HttpMessageConverter<Object> extraJSONConverter() {
		MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
		List<MediaType> supportedMediaTypes = new ArrayList<>(jsonConverter.getSupportedMediaTypes());
		supportedMediaTypes.add(MediaType.valueOf("application/csp-report"));
		jsonConverter.setSupportedMediaTypes(supportedMediaTypes);
		return jsonConverter;
	}
}

report-to 沒法使用

在 MDN 中,建議使用 report-to,report-uri要準備被淘汰

但我自己使用 report-to 是沒用的;照 MDN 給的 Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-report ; report-to csp-endpoint 也一樣沒效果

Gecko Base 和 Chromium Base 瀏覽器都有試過了

所以短期間還是先用 report-uri 好了

沒有留言:

張貼留言