最近在公司搭建的对外的服务上,被安全部门检测出安全漏洞。主要分为两个方面的漏洞:

  1. 用户的邮箱等信息在接口中直接明文展示出来,甚至有些 密码 摘要也暴露出来了
  2. 附件上传 没有限制,同时对于 HTML 文件运行直接同域 text/html 访问

下面介绍我是如何解决上面漏洞的

解决手段

数据明文暴露

对于数据明文暴露漏洞,现象如:对于 /user?id=1 接口,返回数据

{
  status: 'ok',
  data: {
    user: {
      name: 'xxx',
      // 邮箱属于个人敏感数据
      email: 'xxxx@xxx.com',
    }
  }
}

对于 邮箱 等用户个人数据,需要隐藏,所以处理方式有: 1. 将邮箱脱敏处理,如 imcuttle@abc.com 脱敏为 im***@abc.com
但这种方式,可能对于有些需要明文展示用户信息的地方不友好 2. 对请求参数或者响应数据 做加密处理
如对于某请求响应数据如图 image.png 而真真数据就藏在这串数据中,经过解密可以看到真正的数据,在这里我不深入介绍我是如何实现的,防止破解

除此之外,我们看看网易云音乐的 API 是如何处理的: image.png 网易云的请求参数进行了加密处理,大概思路如下: image.png

由于 对称加密算法对加密内容有最大字节限制,所以只能用于加密固定大小的密钥;而 非对称加密算法则没有该限制,所以用于加密正文内容。

通过 网易云音乐的例子,我们可以知道 前端是不可能杜绝黑客获取明文内容的,破解对于黑客来说只不过对 ROI 的均衡考量。

同时,我们还是可以通过如下手段加大破解难度:

  • debugger 拦截,打开控制台的时候进行 debugger 拦截
  • console 覆盖,不能正常输出
  • 代码混淆(deadcode 添加,常量编码...)

详见:javascript-obfuscator

任意文件上传漏洞

这个问题,我们可以简单的设置服务端的运行上传文件白名单,如只允许上传图片;但这样可能导致体验降级。

所以我的处理方式是,对于 HTML 资源,(同域)服务端不进行 Server,而是纯文本展示。