V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nikoo
V2EX  ›  问与答

按流量付费的图片 CDN 如果想坑你是不是毫无办法?

  •  
  •   nikoo · 2018-10-09 13:33:55 +08:00 · 2958 次点击
    这是一个创建于 1997 天前的主题,其中的信息可能已经有所发展或是发生改变。
    个人有一个练手作品,一个采集二手信息的网站,里面有一些物品的图片,之前就存在 VPS 上

    后来由于某图片 CDN 大力宣传加发送代金券,就把新采集的图片上传至该图片 CDN

    网站从未推广,放了几年,最后统计访问量每天几百,没挣过一毛钱

    代金券消耗完后,邮件告诉我欠费了,一看账单近百,
    我就很奇怪,网站明明没有那么大访问量,仅图片为什么能跑这么多流量?

    开始怀疑是搜索引擎爬历史图片,或图被盗用了,所以做了如下操作:
    1、每天通过 API 删除两个月以前图片的定时任务,也就是存在该 CDN 上只有近两个月的图片
    2、最严格的防盗链,referrer 限制为仅唯一本域名可打开图片,none 都无法打开,也就是直接帖图片 URL 在浏览器是打不开的

    本来以为有用,结果网站访问量不见升,CDN 账单破百了。

    我就很奇怪,然后脑抽做了这么一个东西:
    开启 nginx 针对所有图片的 access log,然后写了一个脚本统计每天具体访问图片的 request
    然后针对这个 request 的 response size 统计出一个总流量来
    这样我就知道每天到底图片流量跑了多少了

    结果弄完才意识到,真是脑抽了,我在用高大上的图片 CDN 啊!!!
    它只有一次的请求后就把图片缓冲在它一万个节点里去了,然后再也不会访问我的 nginx 了,它一万个节点不知道哪个节点跑的流量都会跟我算钱,并且我也根本没法统计流量被什么客户端跑走了。

    想了想,非常绝望,图片被它的节点缓冲了,那么是不是它说跑了多少流量就是多少?
    有没有任何方法可以验证真伪?玩的就是一个诚信?
    23 条回复    2018-10-09 15:27:03 +08:00
    mason961125
        1
    mason961125  
       2018-10-09 13:37:57 +08:00 via iPhone
    看下 CDN 的日志?
    gstqc
        2
    gstqc  
       2018-10-09 13:42:25 +08:00 via Android
    CDN 可以配置防盗链……
    nikoo
        3
    nikoo  
    OP
       2018-10-09 13:43:43 +08:00
    @gstqc 配置了,"直接帖图片 URL 在浏览器是打不开的"
    iConnect
        4
    iConnect  
       2018-10-09 13:44:12 +08:00 via Android
    cdn 都有消费控制的,自己设定下限制。
    gstqc
        5
    gstqc  
       2018-10-09 13:45:03 +08:00 via Android
    你可以下载访问日志
    coosir
        6
    coosir  
       2018-10-09 13:45:30 +08:00
    服务商是不是可以随便编一些流量出来 - -,反正你没法验证
    gstqc
        7
    gstqc  
       2018-10-09 13:49:21 +08:00 via Android
    @coosir 你可以下载访问日志
    访问日志和你主站的访问做对比即可
    kslr
        8
    kslr  
       2018-10-09 13:51:32 +08:00
    你那个算什么防盗链

    另外 CDN 去走你流量,明明不管是成本还是法律以及道德是得不偿失的事情,为什么这么多人会相信呢?
    kslr
        9
    kslr  
       2018-10-09 13:52:46 +08:00
    这里明明是技术社区,而大多数人都不知道先看看官方给的资料
    nikoo
        10
    nikoo  
    OP
       2018-10-09 13:55:41 +08:00
    @mason961125 @gstqc 谢谢,搜了一下的确是可以通过开启空间的访问日志来获得日志文件

    这个日志似乎默认是关闭的?

    登录了一下发现:对不起,您的账户已被冻结
    nikoo
        11
    nikoo  
    OP
       2018-10-09 13:57:24 +08:00
    @kslr 请问 CDN 的防盗链不是在 CDN 后台配置限制请求来路来做吗?

    应该用什么正确的办法进行防盗链?
    kslr
        12
    kslr  
       2018-10-09 14:02:01 +08:00   ❤️ 1
    kslr
        13
    kslr  
       2018-10-09 14:03:57 +08:00
    @nikoo #11 但是我看你的网站是公开 cdn 加速,不太适合。我觉得还是从日志下手,分析流量来源到底在哪里
    nikoo
        14
    nikoo  
    OP
       2018-10-09 14:06:30 +08:00
    @kslr 谢谢老铁,我之前真不知道这种防盗链安全机制

    有没有这种安全机制下的站点或者 demo 可以观摩一下?谢谢!
    kslr
        15
    kslr  
       2018-10-09 14:11:17 +08:00   ❤️ 1
    @nikoo 流量稍微大点,基本都有,毕竟国内流量这么贵。不同的只是算法不一样,你可以根据 SDK 简单调用接口。
    https://developer.qiniu.com/kodo/manual/1202/download-token
    nikoo
        16
    nikoo  
    OP
       2018-10-09 14:31:33 +08:00
    @kslr 谢谢

    我并不是想对 CDN 平台做有罪推断

    出现的问题大多可能是由于我本人不认真研究、技术欠佳导致

    综上回复学习到几点来解决该问题:
    1、开启 CDN 访问日志
    2、应用更为严格的 安全机制 - 下载凭证( DownloadToken )来验证每一个图片的访问请求

    第二点实现起来难度大,需要为每次请求页面里的每一张图片生成其独立唯一的 Access Token,运算量有些大
    kslr
        17
    kslr  
       2018-10-09 14:40:44 +08:00   ❤️ 1
    @nikoo 关于第二点七牛不是太清楚,但是边缘计算肯定是趋势,也许会有相映的业务(比如 CloudFlare 的 workers,国内最近也频繁提到)。
    我有一个大概每天 400 万请求的 CDN,每一份资源都依靠 edge 计算,这个算法只需要>5ms,实际上也不过是编辑转发请求。
    Access Token 由后台维护,落地并没有多少请求
    kslr
        18
    kslr  
       2018-10-09 14:44:06 +08:00
    如果真的需要,我觉得可以单独维护 AccessToken,对每个链接签名,有效期 1 ~ 6 个小时等,压力就被分散了。
    其实一台破机器也可以轻松解决,毕竟只是很简单的计算签名
    nikoo
        19
    nikoo  
    OP
       2018-10-09 14:48:48 +08:00
    @kslr AccessToken 有效期 1 ~ 6 个小时?为什么不是 request 的生命周期的时间?我理解有效期 30 秒就够了( 30 秒没返回一般就返回 time out 了)

    难道是要针对客户端+图片对其 AccessToken 做一个缓冲?该用户访问某一图片一段时间内重复使用一个 AccessToken ?
    kslr
        20
    kslr  
       2018-10-09 14:55:16 +08:00   ❤️ 1
    根据文档 https://developer.*.com/kodo/manual/1202/download-token
    定义
    AccessToken 对应 MY_SECRET_KEY
    token 是 url sign
    那么也不需要维护“ AccessToken ”了

    有效期是指如果链接在同一个时间点失效,会把压力集中到一个时刻。
    nikoo
        21
    nikoo  
    OP
       2018-10-09 15:07:29 +08:00
    @kslr 这个"下载凭证"在我理解就是传统的 DRM,但我不太明白怎么实现不维护 AccessToken

    比如两个客户端 A、B 在同一时间点访问同一页面上的图片 /a.jpg

    那么这个 A 与 B 是分别获得了
    A 获得 http://*.com/a.jpg?e=过期时间&token=AToken
    B 获得 http://*.com/a.jpg?e=过期时间&token=BToken

    还是 A 与 B 同时获得一个同样的
    http://*.com/a.jpg?e=过期时间&token=Token

    以上两者应是哪个?
    kslr
        22
    kslr  
       2018-10-09 15:20:40 +08:00
    @nikoo
    因为在文档中“ MY_SECRET_KEY ”是一个固定值。
    这取决于签名计算时带入的变量,比如不同的过期时间 token 也会不同
    yc8332
        23
    yc8332  
       2018-10-09 15:27:03 +08:00
    你要在 cdn 上配置防盗链,而不是你的服务器上。。。还有 cdn 都会有日志的,难道你都不看。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1131 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:41 · PVG 02:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.