OSS和CDN都是一些常用的通过流量计费的,如果被恶意刷新将会造成一些不必要的财产损失。本文主要记录一些关于阿里云的oss的防刷措施。
首先我们分两种情况来排查:
1、恶意referer访问
2、恶意ip库脚本刷新
一、恶意referer访问
对于这种访问,常用的是对oss对象设置防盗链来防止。
二、恶意ip库脚本刷新的
阿里云文档里面说到提供下面的三种办法
- 将Bucket访问权限改为私有,通过签名后的URL对外提供服务。私有Bucket可以增加恶意下载的成本,但是也需要业务端集成签名算法,详情请参见集成签名算法,因此会产生一定的开发成本。
- (推荐)迁移数据到新的Bucket中,详情请参见迁移数据,通过高防IP或者WAF防护的自定义域名对外提供服务,详情请参见自定义域名。
- 迁移数据到新的Bucket中,使用自定义域名对外提供服务,同时开启CDN加速,利用CDN的IP黑名单进行限制访问。详情请参见IP黑名单。
当然对于上面的三种办法,我们也可以增加自己的理解。主要就是限流措施,要么在nginx上做,要么在中间增加后端服务限流。
1、存在后端服务的情况。先把Bucket设置成私有的,然后所有请求原来oss的url在后端服务器上包装一层。在后端服务里面我们可以和前端约定加密算法或者jwt检验cookie等,检验通过后我们在请求阿里云获取图片,把阿里云返回的arraybuffer转换成base64或其他返回给前端。同时后端服务可以利用滑动窗口算法来对请求ip限流等操作。
这里需要注意,请求会吃服务的带宽。
方法二:
这里还有一种办法,请求阿里云的oss的时候设置过期时间比如10s,让阿里云oss生成临时地址。我们服务器通过302重定向到这个链接上,就可以了。(建议302,因为301的话 链接失效后刷新就会403)
当然你会问10s后就过期了 这样刷新后再请求 也会浪费服务器资源哈。
我们需要设置response的缓存时间,这样浏览器就不会再请求服务器了。
//强缓存设置靠请求头的Cache-Control或者Expires,听说有兼容性问题,老的是Expires,现在越来越多浏览器支持Cache-Control了,建议全都设上。
//Cache-Control设置的是个相对于现在的时间,单位是秒,Expires设置的是GMT时间,以设置10秒为例:
res.setHeader('Expires',new Date(Date.now()+10*1000).toGMTString())
res.setHeader('Cache-Control','max-age=10')
代理的转换node的话 可以使用koa-proxies。做成一个中间件帮忙转换url。changeOrigin设置成true。
ps:
阿里云oss内网访问不会进行流量计费,但是服务器也得是阿里云的,且服务器选择的是固定宽带!所以你懂的 哈哈
2、Nginx配置限流的方法。
阿里云oss绑定自定义域名、然后在自定一域名上的nginx上配置反向代理到Bucket 域名上。在nginx上配置相应的限流方法。最后注意在nginx上不要忘记特殊code的处理。
限流配置分为两种:
通过请求数进行限流
通过连接数进行限流
http {
limit_req_zone $binary_remote_addr zone=iplimit:10m rate=1r/s;
server {
server_name loclhost;
listen 8080;
location /access-limit/ {
proxy_pass http://127.0.0.1:3000;
# 根据ip地址限制流量
limit_req zone=iplimit burst=2 nodelay;
}
}
}
$binary_remote_addr:binary_目的是缩写内存占用,remote_addr表示通过IP地址来限流
zone:iplimit是一块内存区域(记录访问频率信息),20m是指这块内存区域的大小
rate: 1r/s = 1 request / second,类似于100/m(每分钟100次请求)
burst: burst=2,设置一个大小为2的缓存区域,当大量请求到来,请求数量超过限流频率时,将其放入缓冲区域
nodelay: 缓冲区满了后直接返回503异常
上面是基于单ip的限流,同时还是支持server_name级别的限流
http {
limit_req_zone $server_name zone=serverlimit:10m rate=1r/s;
server {
server_name localhost;
listen 8080;
location /access-limit/ {
proxy_pass http://127.0.0.1:3000;
# 根据服务器级别进行限流
limit_req zone=serverlimit burst=2 nodelay;
}
}
}
最后我们基于链接数的限流
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
server_name localhost;
listen 8080;
location /access-limit/ {
proxy_pass http://127.0.0.1:3000;
# 每个server最多保持100个连接
limit_conn perserver 100;
# 每个ip最多保持1个连接
limit_conn perip 1;
}
}
}
可以在location下通过配置 limit_req_status 504
或limit_conn_status 504
来修改默认errorCode
错误处理:
proxy_intercept_errors on;
error_page 500 502 503 504 /404.html;
error_page 400 404 /404.html;
location = /404.html{
root /www/wwwroot/YOUR-HOST-HERE;
}
参考文章:
OSS被攻击恶意刷流量出现异常流量的排查方法文章来源:https://www.toymoban.com/news/detail-490550.html
oss防刷流量配置!文章来源地址https://www.toymoban.com/news/detail-490550.html
到了这里,关于OSS防止恶意被刷的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!