1
standchan 2023-12-24 20:09:37 +08:00
直接提工单问,方便快捷官方
|
2
Dongxiaohao OP @standchan #1 好家伙,没意识到,这就去问一下
|
3
zzboat0422 2023-12-24 20:12:29 +08:00
部分云厂商的对象存储是有防盗链功能的,不知道阿里云有没有
|
4
Dongxiaohao OP @zzboat0422 #3 防盗链不能实现限制访问频次的需求吧
|
5
Dongxiaohao OP 问了一下 OSS 和 COS 的客服,都不能对访问次数限制,没办法了
|
6
google2020 2023-12-24 20:28:31 +08:00
印象中没这功能,因为没法计算,比如多线程这算一次还是多次呢,断点续传算几次呢。
防被刷记得配合 CDN 使用,CDN 流量便宜很多,也可以用边缘脚本鉴权和限速。 |
7
em70 2023-12-24 20:31:28 +08:00
gpt4 的回答:
阿里云的对象存储服务( OSS )确实提供了生成带签名的 URL 的功能,这些 URL 可以限制访问时间,但根据我最新的了解,阿里云 OSS 本身并不直接支持限制 URL 的下载次数。换句话说,OSS 可以限制一个链接在某个时间点之后不再有效,但不能限制该链接被访问的次数。 如果您的需求是限制资源链接的下载次数以防止资源被盗刷,您可能需要考虑一些替代方案: 中间件控制:您可以设置一个中间件(如服务器端的应用程序),用于管理和分发 OSS 资源链接。这个中间件可以跟踪每个链接的下载次数,并在达到预定次数后停止分发该链接。 数据库记录:您可以在数据库中记录每个链接的下载次数,并在请求时检查次数。如果下载次数超过限制,则拒绝进一步的下载请求。 其他云存储服务:如果阿里云 OSS 不满足您的特定需求,您可以考虑其他云存储服务,如 Amazon S3 或 Google Cloud Storage ,看看它们是否提供了更符合您需求的功能。 第三方解决方案:也可以考虑使用第三方服务或工具,这些服务或工具可能提供了更灵活的访问控制选项,包括基于下载次数的限制。 总之,虽然 OSS 本身可能不支持基于下载次数的限制,但通过一些创造性的解决方案,您仍然可以实现类似的功能。 |
8
kangjm 2023-12-24 20:32:19 +08:00
Presigned url 没这功能 https://stackoverflow.com/questions/54781941/how-to-restrict-number-of-hits-to-s3-bucket-via-presigned-url
你可以连个 redis 来记录访问次数,再在后端做个验证 |
9
cwxiaos 2023-12-24 21:10:44 +08:00 via iPhone
你可以在 serverless 中搞一个简单的透传,中间加一个计数,把签名也放里面,像 Cloudflare Worker, 华为云 FunctionGraph 啥的
|
10
akira 2023-12-24 21:20:41 +08:00
这种上层 偏业务向的需求,需要自己实现
|
11
gaobh 2023-12-24 21:30:36 +08:00 via iPhone
当然是自己写逻辑了,下载链接二次包装一次。因为用户体系和下载次数是在你自己的系统里的
|
12
wunonglin 2023-12-24 21:36:03 +08:00 1
@@Livid #7 GPT 回答
|
15
wunonglin 2023-12-24 22:12:32 +08:00
|
17
lingo 2023-12-25 00:03:04 +08:00
要不还是自己实现吧。想怎么搞就怎么搞。
|
18
yuzo555 2023-12-25 00:21:57 +08:00
可以考虑通过有些 CDN 支持的回源鉴权功能,自己实现一个接口来鉴权。
但实际上链接下载次数这个实现比较麻烦,并不是一次访问就是一次下载,一般一次下载会有很多次分片请求。 如果是一个固定链接,单纯判断 IP 和区分有无 Range 头可能误杀率较高。 这个需求最好还是要动态链接会比较好实现,每个不同的下载 URL 里有不同的 Token |
20
IvanLi127 2023-12-25 00:29:46 +08:00 via Android
业务里自己统计下载次数,没达到次数限制就签个未来几秒内过期的链接给客户端,这样能近似实现效果。
我没实践过,op 可以试试 |
21
whileFalse 2023-12-25 01:49:19 +08:00
这玩意不往你本地写 cookie ,没法计算次数。它的授权基于临时 token 。
它只是一个简单的存储功能,如果你需要业务特性,需要你自己的业务实现。 |
22
cslive 2023-12-25 08:26:02 +08:00
oss 套 cdn 吧,cdn 买流量,流量没了就停用,不然 oss 被刷你就惨了
|
23
sujin190 2023-12-25 08:45:22 +08:00 via Android
厂商的请求数都是后算的吧,而且也只是个统计值,否则近乎实时计算每个对象的请求数这个费用估计都得超过你存储需要的费用了吧,所以没有这功能才是正常的
|
24
my3157 2023-12-25 09:22:22 +08:00 via Android
对象存储的签名机制是纯算法实现,不存储任何状态,验证的本质就是在服务端重新算一遍,所以一但带签名的 URL 泄露,你是没法控制的,你能控制的就是有效期,下载的时候 redirect + 缩短签名有效期 能一定程度上避免,但无法杜绝
|
25
Dongxiaohao OP @gaobh 我能理解成让他不直接请求 oss 的资源地址 直接请求我的接口下载吗,但是如果是这样的话 那下载速度不就被我这台机器的带宽给限制了?
|
26
Dongxiaohao OP @IvanLi127 这个方法确实,我提阿里的工单 他也说你把你的链接时效性设置成几秒就行了
|
27
beyondstars 2023-12-25 13:04:25 +08:00
@Dongxiaohao #25 虽然我没实现过,但感觉可以这样:你用 PreSigned URL (不知道 aliyun OSS 支持否),然后 PreSigned URL 的 hostname 部分指向你的一个服务,然后这个服务统计每一个 PreSigned URL 的请求次数,在此数之内,Http 302 重定向到真正的 PreSigned URL (就是 hostname 没被替换的那个),超过了次数返回错误,这样宽带不受你的服务器的限制。
|
28
beyondstars 2023-12-25 13:06:22 +08:00
比如说你拿到的一个 PreSigned URL 是 https://oss.aliyun.com/xxx ,你就把它替换成 https://your-service.example.com/xxx ,然后你在 your-service.example.com 部署那个判断次数的 HTTP 应用。
|
29
HTDit 2023-12-25 17:27:33 +08:00 via Android
@IvanLi127 你知道我为什么说他质量高吗,对于 op 的问题他直接给出了答复,并且在此基础上给出了其他实现途径和方法,我觉得这简直是太棒了。而且他的内容除了开头和结尾官方式答复,中间的内容是条理清晰,不会让人读来摸不着头脑。
|