前端文件上传的安全性理解

574 阅读2分钟

案例分析

部门业务:客户通过web上传资源文件(图片、视频),客户端通过下载资源文件到本地进行展示;

安全隐患:攻击者上传一些攻击的脚本文件,文件在客户的机器上被执行,带来很大的安全隐患。

1、JavaScript对文件后缀名检查。

检验方案:

前端可以通过校验文件流的type类型;比如下面只允许部分图片类型的上传

 const isUploded = file.type === 'image/jpeg' || file.type === 'image/png'
 if (!isUploded) {
   this.$message.error('You can only upload JPG file!')
 }
 

可行的攻击手段

攻击者定义一个脚本,直接是不能通过验证的。 image.png 但是通过修改文件后缀后image.png 上传文件直接通过了验证 image.png

解决方案:前端魔数检测

所有文件在计算机中都是以二进制模式进行存储的,不同类型的文件的二进制前缀一定有区分的,因此上传文件需要通过二进制更加准确的检测文件类型。 魔数检测原理方法

常见的文件前缀:

  • jpg:FFD8FF
  • png:89504E47
  • gif:47494638
  • HFML:68746D6

2、服务器对content-type进行校验。

Content-type是客户端标识到浏览器中的,请求时携带在http报文中;后端可以通过判断该类型进行验证。

可行的攻击者手段

攻击者通过一些第三方的工具比如(Fiddler),攻击拦截http请求,伪造Content-type的内容,绕过后端的检测(如下图)。

Fiddler拦截请求

1663082318055.jpg

Fiddler修改参数类型-发送

1663082450151.jpg

方案:魔术检测+Content-type校验

服务器的content-type可能被伪造,只能作为验证的辅助手段;服务端也需要准确的问题类型校验。

其他的攻击手段(后端校验可能多一点)

  • dos攻击,没有限制文件上传的大小、上传评率。
  • 攻击者生成一张有恶意代码又是合法图片的文件。
  • 上传文件后,文件名称没有随机生成,可能暴露服务器的文件路径等等。