OSS防止恶意被刷

2 篇文章 0 订阅
2 篇文章 0 订阅

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 504limit_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被攻击恶意刷流量出现异常流量的排查方法

oss防刷流量配置!

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值