由于平台部署在华为云环境上,华为方面就给我们平台做了一次安全检查,通过反馈的结果,扫描到的漏洞大致分为5种,分别是:跨站请求伪造、信息泄露、路径遍历、跨站脚本攻击以及其它,下面将对这几类的漏洞给出我的解决方案。
1. 跨站请求伪造
1.1 漏洞简介
可能会使网站接受不安全的HTTP请求,暴露web应用程序敏感信息
1.2 解决方案
当一个链接被点击的时候,作为客户端的浏览器会向web服务器发送请求,在HTTP请求头上会携带Referer参数,Referer上会带有请求的源头地址,如下图。我们可以在请求发送到网关的时候,对Referer的值做校验,如果请求来源是我们指定地址,那么就放行,否则对请求进行拦截。对于那些需要放行的地址可以统一设置白名单,然后针对符合白名单中的请求来源进行放行。
2. 信息泄露
2.1 漏洞简介
https的请求中,收集有关web服务器的敏感信息
2.2 解决方案
添加X-Frame-Options消息头。X-Frame-Options允许一个页面是否在 <frame>, </iframe> 或者 <object> 中展现,确保网站的内容没有被嵌套到别的网站中,避免点击劫持的攻击。解决方案是在nginx.conf配置文件的http或者server下加上"add_header X-Frame-Options sameorigin;",保证页面可以在相同域名页面的frame中展示。
添加X-Content-Type-Options消息头。互联网上的资源有很多类型,如"image/png"是png图片,"text/css"是css样式文档等,这些类型的值会放在Content-Type上。当资源的Content-Type不正确或者未定义,某些浏览器会启用MIME-sniffing来猜测该资源的类型,攻击者会利用这一点将原本是图片的解析成了js脚本。解决方案是在nginx.conf配置文件的http或者server下加上"add_header X-Content-Type-Options nosniff;",做到禁止浏览器的类型猜想行为。
添加Cache-Control消息头。通常设置Cache-Control是为了对网页进行缓存,加快浏览器的访问速度,但是对于一些存有敏感数据的页面,如果设置了缓存,在受到攻击之后很容易被窃取到数据。解决方案是在展示敏感信息的页面上加上"<meta http-equiv="cache-control" content="no-store">",并且在nginx.conf里加上"add_header Cache-Control no-store;",达到禁用高速缓存的目的。
禁用不常用的HTTP请求方式,这里介绍两种比较危险的请求方式,分别是trace和options。trace请求会使服务器返回任何客户端请求的内容,这样攻击者可以拿到前端的某些信息,为攻击提供便利。攻击者还可以通过trace方法绕过浏览器开启的HttpOnly头和禁用脚本,从而读取cookie信息。options请求没有trace的危险系数高,但options也会暴露一些敏感信息出来。比较简单的处理方式是在nginx.conf的server里面加上如下图配置,表示对于options和trace类型的请求到达nginx的时候,将请求拦截下来不再转发到服务器上,保证服务器的信息安全。针对有些请求可能会绕过代理服务器的情况,我在下一层的网关又做了一层拦截,方法是在代码里校验请求的类型是否需要禁止。
3. 路径遍历
3.1 解决方案
这种漏洞有些就比较低级了,被检查出来的原因是,前端代码的注释里包含具体的ip地址,如"...src=\'http://192.168.1.84:5007/console\'...",只要把这些暴露ip的代码删除即可。
4. 跨站脚本攻击
4.1 漏洞简介
可能会收集有关 Web 应用程序的敏感信息,如用户名、密码、机器名和/或敏感文件位置
4.2 解决方案
添加X-Xss-Protection消息头。这里介绍一下什么是xss攻击,指的是攻击者在web页面中会插入一些恶意的script代码,当用户浏览到该页面的时候,页面就会执行这块恶意代码,达到攻击用户的目的。解决方案是在nginx.conf文件的server里添加"add_header X-Xss-Protection "1; mode=block";",表示启用xss保护,并在检查到xss攻击时,停止渲染页面。
如果不放心,还可以在网关再做一层拦截,具体代码参考https://www.cnblogs.com/huyj99/articles/12459488.html。
5. 其它
5.1 Nginx Null Code .name
表示在请求的url地址的最后加上/.php,这种攻击类似于sql注入的攻击,改变用户的请求意愿。在nginx.conf配置中加上如下配置即可,过滤掉请求参数中不合理的参数。
5.2 HTML注释敏感信息泄露
表示在html代码中包含了文件名、文件路径、重要链接以及核心代码片段等。解决方案是删除掉这些注释,并养成良好的开发习惯,保证重要信息不包含在代码注释中。
5.3 HTST严格传输安全策略头缺失
这种情况可能会使网站接受不安全的HTTP请求,暴露web应用程序敏感信息。添加Strict-Transport-Security消息头,它告诉浏览器只能通过HTTPS访问当前资源,禁止HTTP方式。在nginx.conf中的server里加上"add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";",它表示在接下来的一年里向当前服务器的域名及其子域名发送HTTP请求时,必须采用HTTPS来发起连接;如果当前服务器发送的TLS证书无效,则用户不能忽略浏览器警告继续访问网站。
5.4 电子邮件地址泄露
如"pic_xinfeng@2x.png"这种名称的图片被检测为漏洞也是很出乎我的意料,解决办法就是删除文件名称中的"@"符号即可。