V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Dongxiaohao
V2EX  ›  程序员

请教一下大伙们对象存储的问题

  •  
  •   Dongxiaohao · 335 天前 · 2629 次点击
    这是一个创建于 335 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前用阿里的 OSS ,用 STS 对资源链接进行签名。但是我在文档中只发现可以设置链接时效性的参数。
    我的需求是,这个链接只能下载指定次数(自己设置),超过指定次数之后,就无法打开下载了。
    在阿里的 oss 文档上貌似没有看见相关的案例。

    这样操作主要的作用就是防止资源被盗刷,如果 oss 没有这样的操作,其他的 bucket 有这种操作吗?
    32 条回复    2023-12-26 00:54:12 +08:00
    standchan
        1
    standchan  
       335 天前
    直接提工单问,方便快捷官方
    Dongxiaohao
        2
    Dongxiaohao  
    OP
       335 天前
    @standchan #1 好家伙,没意识到,这就去问一下
    zzboat0422
        3
    zzboat0422  
       335 天前
    部分云厂商的对象存储是有防盗链功能的,不知道阿里云有没有
    Dongxiaohao
        4
    Dongxiaohao  
    OP
       335 天前
    @zzboat0422 #3 防盗链不能实现限制访问频次的需求吧
    Dongxiaohao
        5
    Dongxiaohao  
    OP
       335 天前
    问了一下 OSS 和 COS 的客服,都不能对访问次数限制,没办法了
    google2020
        6
    google2020  
       335 天前
    印象中没这功能,因为没法计算,比如多线程这算一次还是多次呢,断点续传算几次呢。

    防被刷记得配合 CDN 使用,CDN 流量便宜很多,也可以用边缘脚本鉴权和限速。
    em70
        7
    em70  
       335 天前
    gpt4 的回答:

    阿里云的对象存储服务( OSS )确实提供了生成带签名的 URL 的功能,这些 URL 可以限制访问时间,但根据我最新的了解,阿里云 OSS 本身并不直接支持限制 URL 的下载次数。换句话说,OSS 可以限制一个链接在某个时间点之后不再有效,但不能限制该链接被访问的次数。

    如果您的需求是限制资源链接的下载次数以防止资源被盗刷,您可能需要考虑一些替代方案:

    中间件控制:您可以设置一个中间件(如服务器端的应用程序),用于管理和分发 OSS 资源链接。这个中间件可以跟踪每个链接的下载次数,并在达到预定次数后停止分发该链接。

    数据库记录:您可以在数据库中记录每个链接的下载次数,并在请求时检查次数。如果下载次数超过限制,则拒绝进一步的下载请求。

    其他云存储服务:如果阿里云 OSS 不满足您的特定需求,您可以考虑其他云存储服务,如 Amazon S3 或 Google Cloud Storage ,看看它们是否提供了更符合您需求的功能。

    第三方解决方案:也可以考虑使用第三方服务或工具,这些服务或工具可能提供了更灵活的访问控制选项,包括基于下载次数的限制。

    总之,虽然 OSS 本身可能不支持基于下载次数的限制,但通过一些创造性的解决方案,您仍然可以实现类似的功能。
    kangjm
        8
    kangjm  
       335 天前
    Presigned url 没这功能 https://stackoverflow.com/questions/54781941/how-to-restrict-number-of-hits-to-s3-bucket-via-presigned-url

    你可以连个 redis 来记录访问次数,再在后端做个验证
    cwxiaos
        9
    cwxiaos  
       335 天前 via iPhone
    你可以在 serverless 中搞一个简单的透传,中间加一个计数,把签名也放里面,像 Cloudflare Worker, 华为云 FunctionGraph 啥的
    akira
        10
    akira  
       335 天前
    这种上层 偏业务向的需求,需要自己实现
    gaobh
        11
    gaobh  
       335 天前 via iPhone
    当然是自己写逻辑了,下载链接二次包装一次。因为用户体系和下载次数是在你自己的系统里的
    wunonglin
        12
    wunonglin  
       335 天前   ❤️ 1
    @@Livid #7 GPT 回答
    wunonglin
        13
    wunonglin  
       335 天前   ❤️ 1
    HTDit
        14
    HTDit  
       335 天前 via Android
    @wunonglin 你想表达什么??这个回答明明质量很高啊。
    wunonglin
        15
    wunonglin  
       335 天前
    @HTDit #14

    https://www.v2ex.com/about

    ```
    请不要把 AI 生成的内容发送到这里
    ```
    yolee599
        16
    yolee599  
       335 天前 via Android
    @HTDit #14 本站禁止回复 AI 生成的内容,一没经过验证,二一大堆啰嗦话占浏览空间
    lingo
        17
    lingo  
       335 天前
    要不还是自己实现吧。想怎么搞就怎么搞。
    yuzo555
        18
    yuzo555  
       335 天前
    可以考虑通过有些 CDN 支持的回源鉴权功能,自己实现一个接口来鉴权。

    但实际上链接下载次数这个实现比较麻烦,并不是一次访问就是一次下载,一般一次下载会有很多次分片请求。
    如果是一个固定链接,单纯判断 IP 和区分有无 Range 头可能误杀率较高。

    这个需求最好还是要动态链接会比较好实现,每个不同的下载 URL 里有不同的 Token
    IvanLi127
        19
    IvanLi127  
       335 天前 via Android
    @HTDit 那个回答质量差得离谱,字多的车轱辘话
    IvanLi127
        20
    IvanLi127  
       335 天前 via Android
    业务里自己统计下载次数,没达到次数限制就签个未来几秒内过期的链接给客户端,这样能近似实现效果。

    我没实践过,op 可以试试
    whileFalse
        21
    whileFalse  
       335 天前
    这玩意不往你本地写 cookie ,没法计算次数。它的授权基于临时 token 。

    它只是一个简单的存储功能,如果你需要业务特性,需要你自己的业务实现。
    cslive
        22
    cslive  
       335 天前
    oss 套 cdn 吧,cdn 买流量,流量没了就停用,不然 oss 被刷你就惨了
    sujin190
        23
    sujin190  
       335 天前 via Android
    厂商的请求数都是后算的吧,而且也只是个统计值,否则近乎实时计算每个对象的请求数这个费用估计都得超过你存储需要的费用了吧,所以没有这功能才是正常的
    my3157
        24
    my3157  
       335 天前 via Android
    对象存储的签名机制是纯算法实现,不存储任何状态,验证的本质就是在服务端重新算一遍,所以一但带签名的 URL 泄露,你是没法控制的,你能控制的就是有效期,下载的时候 redirect + 缩短签名有效期 能一定程度上避免,但无法杜绝
    Dongxiaohao
        25
    Dongxiaohao  
    OP
       335 天前 via Android
    @gaobh 我能理解成让他不直接请求 oss 的资源地址 直接请求我的接口下载吗,但是如果是这样的话 那下载速度不就被我这台机器的带宽给限制了?
    Dongxiaohao
        26
    Dongxiaohao  
    OP
       335 天前 via Android
    @IvanLi127 这个方法确实,我提阿里的工单 他也说你把你的链接时效性设置成几秒就行了
    beyondstars
        27
    beyondstars  
       335 天前
    @Dongxiaohao #25 虽然我没实现过,但感觉可以这样:你用 PreSigned URL (不知道 aliyun OSS 支持否),然后 PreSigned URL 的 hostname 部分指向你的一个服务,然后这个服务统计每一个 PreSigned URL 的请求次数,在此数之内,Http 302 重定向到真正的 PreSigned URL (就是 hostname 没被替换的那个),超过了次数返回错误,这样宽带不受你的服务器的限制。
    beyondstars
        28
    beyondstars  
       335 天前
    比如说你拿到的一个 PreSigned URL 是 https://oss.aliyun.com/xxx ,你就把它替换成 https://your-service.example.com/xxx ,然后你在 your-service.example.com 部署那个判断次数的 HTTP 应用。
    HTDit
        29
    HTDit  
       334 天前 via Android
    @IvanLi127 你知道我为什么说他质量高吗,对于 op 的问题他直接给出了答复,并且在此基础上给出了其他实现途径和方法,我觉得这简直是太棒了。而且他的内容除了开头和结尾官方式答复,中间的内容是条理清晰,不会让人读来摸不着头脑。
    IvanLi127
        30
    IvanLi127  
       334 天前 via Android
    @HTDit 我觉得那个答案可行性不够,有头没尾,后面一半直接扯套话了,把问题重新抛出来。中间那几行感觉有深入了解的价值,但是具体怎么做没说清楚,问 ai 还能追问。7 段话就 2 段有用啊,看不出来个答案质量有多高...
    HTDit
        31
    HTDit  
       334 天前 via Android
    @IvanLi127 那你感觉你的方案和 ai 回答的数据库下限制,在实现方向上,有区别吗
    IvanLi127
        32
    IvanLi127  
       334 天前 via Android
    @HTDit 我认为 ai 没有结合对象存储提供可行方案,只要没提签短时间的链接,方向到底一不一样,还得再问一两次才知道。
    反正我没看出来这份 ai 回答有什么好的,ai 好不好就到此为止吧,我的答案不配和 ai 比。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2660 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:12 · PVG 13:12 · LAX 21:12 · JFK 00:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.