HTTP Security Report上分
HTTP Security Report是一个用来评估网站安全度的网站,里面有很多安全性指标。在动笔开始写这篇文章的时候,本站的评分是这样的:
昂,也并不是真的从0开始,还是得了点分的,毕竟Server Clock侥幸还是对的,PHP也都设置了production mode,wp也有cache control。接下来我们就要一项一项地攻破剩下的项目了。
HTTPS配置
在 这篇 博文中记录了我升级HTTPS和HTTP2的历程,进行完这次升级之后,我们的评分稍有提高。
Content Security Policy
关于CSP的由来可以参考:Content Security Policy介绍,里面有很详细的设置。
但是在设置自己nginx的header的时候,要废一番功夫,我是开着F12一遍一遍刷新看console,最后才把CSP搞定的……
1 |
add_header Content-Security-Policy "default-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' http://blog.yiz96.com https: data:; style-src 'self' 'unsafe-inline' https:; font-src 'self' data: https:; connect-src 'self'"; |
Frame Options
这个应该是X-Frame-Options头,说明在这里,大概意思是说是否允许本页面在一个iframe中被展示(比如一些网页代理服务),在这里我们设置为允许同源即可:
1 |
add_header X-FRAME-OPTIONS "SAMEORIGIN" |
Content Type Options
这个是头是由IE8引入的,以下选项可以关闭IE8根据拓展名自动判断MIME类型的功能。。。。。介绍来自MDN
1 |
add_header X-Content-Type-Options "nosniff"; |
Subresource Integrity
这个主要是对要引用的资源进行校验,将校验值写入到引用标签的integrity属性中,防止托管在第三方(如CDN)的文件被篡改,如:
1 |
<script crossorigin="anonymous" integrity="sha256-b/TAR5GfYbbQ3gWQCA3fxESsvgU4AbP4rZ+qu1d9CuQ=" src="https://example.com/static/js/other/zepto.js"></script> |
参考Subresource Integrity介绍。在Wordpress中有SRI manager插件,下载启用即可。
Public Key Pins
HTTP
具体方法是先用链接中后面的命令来获得证书的加密指纹,然后加入http头中:
1 |
add_header Public-Key-Pins 'pin-sha256="xxxxxxxxxxxxxxx"'; |
Server Banner
搜了一下字面意思没搜到 = =。。。看了下页面上的提示马上懂了。。就是说隐藏http回包里的cgi版本。
其实这个东西在编译nginx的时候改一下#define的内容就好了。。不过这是修改,不是隐藏。隐藏的话,只需要在nginx.conf的http块加上 server_tokens off; 就可以了。
Cache Control
这个也是http头,cache-control,意义是告诉浏览器页面的缓存方式,有public、private、no-cache等等,还可设置参数,详细可参考这里。博客通常cache一下是无所谓的,但是可能有用户验证信息,所以我这里设置了 add_header Cache-Control 'private, max-age=600';
Web framework Information
昂。。大概意思就是说X-Powered-By
, X-Runtime
, X-Version
和 X-AspNet-Version
不要出现在头部里,可能有潜在安全隐患(比如你的对应fpm有0-day之类的黑客就知道了)。。检测网站也提供了一篇文文章做参考:Shhh… don’t let your response headers talk too loudly,但是好像对nginx服务器没啥用。。。
这个主要看自己现在有哪里返回多余吧。目前我看到的是我的服务器会返回x-powered-by字段,如果是PHP信息,可以直接在php.ini里设置 expose_php=Off ,但是我这个好像不是(是W3C Total Cache啥的……)
做到这里我们已经有88分了,但是还有两项没有搞定
HTTP Strict Transport Security
HSPS也是一个http头,当设置了这个头的时候,浏览器就会把该站点加入HSPS列表,并使用https协议访问。MDN也有相关文档,但是我照说明hstspreload.org上把yiz96注册HSTS之后,子站点还是不认……
Web framework Infomation
大概就是说最好移除http回包里X-runtime、version之类的字段。目前我的nginx这些字段都是编译时mock的……如果想移除可以通过一些nginx插件来搞,比较懒,反正从安全角度上这一点已经没啥问题了……