這邊記錄一下我在 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 好了
沒有留言:
張貼留言