全站HTTPS加密混合不安全内容(外链问题)报告

背景

很早之前用的51.la统计(十年了),现在网站上全站https后51.la不支持https,估计已经没人维护了吧。 它会导致浏览器报告:


解决办法

替换为百度统计 + Google Analytics


预防机制

以后还可能会有非https的图片、css、js等不安全资源的意外引入,需要有一个机制能及时发现。

庆幸的是现代浏览器有提供这样的机制(Content-Security-Policy Report),我们只需要配置一个响应头(Golang DEMO):

1
2
3
4
5
6
type PreHandler http.HandlerFunc

func (p PreHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Security-Policy-Report-Only", "default-src https: 'unsafe-inline' 'unsafe-eval'; report-uri /api/csp-report")
p(w, r)
}

也可以选择在 nginx上配置:

1
add_header Content-Security-Policy-Report-Only "default-src https: 'unsafe-inline' 'unsafe-eval'; report-uri /api/csp-report"

然后提供一个接收日志的接口 ,可以接收到如下JSON内容(注意:blocked-uri):

1
2
3
4
5
6
7
8
9
10
11
{
"csp-report": {
"document-uri": "https://yryz.net/softlist.htm",
"referrer": "",
"violated-directive": "default-src https: 'unsafe-inline' 'unsafe-eval'",
"effective-directive": "script-src",
"original-policy": "default-src https: 'unsafe-inline' 'unsafe-eval'; report-uri /api/csp-report",
"blocked-uri": "http://js.users.51.la",
"status-code": 0
}
}

可以清楚的知道是哪个资源导致的,如果我们把此机制加入到网站中,通过众多用户的“测试”就可以及早发现问题并修复。


参考: