表单里的附件上传是很多企业官网的标配,用来收简历、收资质、收设计稿。这个看起来很普通的功能,一旦校验不严,就可能成为站点被入侵的入口,而且出问题时往往不是从上传页面本身暴露出来的。
最大的误区是只看后缀名
只在页面上判断文件扩展名远远不够。请求可以绕开前端脚本直接发到服务端,文件名也能被伪造成常见的图片后缀。更可靠的做法是在服务端结合文件内容的特征判断真实类型,并且采用白名单方式限定允许的格式,而不是列出一串禁止的格式。禁止清单永远列不全,白名单才管得住。
文件不要放在能被直接执行的位置
上传目录如果和站点程序处在同一个可执行路径下,攻击者上传的文件就可能被访问并执行。稳妥的做法是把上传目录设置为不可执行,或者把文件存放到独立的对象存储中,通过受控的方式读取,从机制上消除执行的可能,而不是指望事后删除。
重命名与路径要可控
保存时由服务端生成新的文件名,不直接采用用户提交的原始名称,可以避免路径穿越与特殊字符带来的麻烦;存放路径也不应由用户输入直接拼接,防止通过构造参数把文件写到预期之外的目录。命名规则简单一致,后续排查问题也方便。
大小与频率都要设限
设置合理的体积上限,超出就直接拒绝,避免大文件把磁盘占满;对同一来源的提交频率做出限制,防止有人批量上传占用资源。上传接口同样应当纳入站点的反垃圾策略,与其他表单提交一并防护,而不是单独留一个没有约束的口子。
访问与权限别忽略
如果上传的是内部资料,就不应设置成公开可访问的地址,而应通过带权限校验的方式下载。简历这类包含个人信息的文件尤其要注意,随意公开几乎等同于泄露。下载环节应当校验当前访问者是否有权查看该文件,而不是只要知道地址就能拿到。
上线前检查这几项
是否在服务端做了类型与内容双重校验;上传目录是否不可执行;文件名是否由服务端生成;是否设置了大小与频率限制;上传与下载是否都有权限控制;异常上传是否留有记录。逐项确认之后再开放这个功能,比上线后回头补要省心得多。
小结
文件上传是典型的看起来小、风险却不小的模块。把校验放在服务端、把文件放到不可执行的位置、把访问权限收窄,这三件事做到位,绝大多数问题就能被挡在门外。
关于冉冉科技
江苏冉冉信息科技有限公司(品牌“冉冉科技”)成立于2017年,位于江苏省常州市新北区,是一家从事互联网信息服务、电子商务应用与企业应用系统开发的技术服务企业。公司业务涵盖网站建设、网页设计、SEO优化、竞价包年、域名注册、虚拟主机、企业邮箱、整合营销及企业形象策划等,以“只做有效果的网络营销”为服务主张,累计完成三千余起网站建设与服务。

冉冉科技

商务咨询