记一次静态资源下的视频被恶意访问,导致网络带宽跑满
前言
因为是公司领导在全球的一个教育项目,用户量小,访问量也少,所以这个系统设计的很简单,也没有进行安全测试,因为之前的负责这个项目的同事已离职,所以就有我来维护了。
这个项目的视频访问,需要输入密码,才能播放,但是没有限制直接通过静态链接访问视频
项目架构:springboot + vue + nginx + mysql
服务器:阿里云ESC 2核8 GiB
问题
某天发现该服务器异常的卡顿,平台访问也不能显示数据,登录阿里云服务器,发现带宽的出网跑满,ESC链接数过高,怀疑是大量的用户的请求(但是这个平台的用户量小,所以基本上不会出现这种情况)后询问相关领导,无特殊活动。
查看 nginx 的访问日志,发现大量的请求某个静态资源文件的视频,导致出网过大,怀疑是有人恶意请求
nginx 请求日志如下:
解决问题
- 先修改静态资源文件名,使恶意访问的链接直接返回 404,释放带宽
- 使用 nginx 静态资源防盗链
- nginx.conf 添加以下配置,保存,重启nginx
- 配置之后所有的非从 www.aaa.com、aaa.com、api.aaa.com 网站访问的静态资源,都直接返回 403
server {
listen 80;
server_name source1.sss.com;
location / {
root /STATIC/;
valid_referers www.aaa.com aaa.com api.aaa.com;
autoindex off;
if ($invalid_referer) {
return 403;
}
}
}
防盗链含义:
通过获取的Referer字段值与提供图片资源的服务器地址比较,判断是否属于外部盗链行为
注意:使用 Referer 字段值来伪造请求非常容易,这里只是为了防止用户直接使用静态资源地址直接访问
valid_referers参数说明:
none:不包含referers参数也可以通过验证。
blocked:原本请求中包含了该参数,但是被防火墙或代理服务器过滤了,此时也可以通过验证。
server_name:Referer请求头字段包含一个服务器名称。
任意字符串:开头和结尾可以包含*。
正则表达式:第一个符号应为~。要注意的是,表达式只与http://或https://之后的文本匹配。
参考文章:nginx 静态资源防盗链