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

用过七牛的来说说你们的安全策略吧

  •  
  •   loveltyoic · 2015-07-28 11:05:20 +08:00 · 3108 次点击
    这是一个创建于 3194 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说下我的使用场景:

    上传方式是七牛直传:用户在APP端用七牛的SDK直接传图片到七牛服务器,然后七牛回调我服务器上的接口。

    客户端上传首先需要一个token,这个token当然是由自己的服务器颁发,那么就涉及到一个安全问题,如何限制恶意用户窃取token并上传垃圾文件?(七牛是可以限制上传文件类型和大小的,这个问题就可以不考虑了。)

    我的想法是从两方面来解决这个问题:

    限制token获取

    因为token本身也是通过API来获取的,那么如何区分恶意用户和正常请求呢?这其实是一个普遍的问题,就是如何保护API。我觉得这里存在一个矛盾:API本身是开放的,但是我们需要限制一些API的使用,如何做到?欢迎分享下这方面的经验。

    回到这个问题。如果上传限制为登录用户才能使用的话,可以在token获取阶段附上用户id,然后硬性限制每个id每天获取token的次数,比如50次。但是问题又出现了,如果恶意用户把参数篡改成其他的用户id,限制就失去意义了。为了防止篡改请求,第一个想到的就是对请求进行签名。严格来说,我这里使用的方法其实并不是公钥体系中的签名,而是一个简化方法。首先服务器和客户端需要共享一个秘密字符串secret,这需要在客户端hardcode。

    计算方法就是md5(uid=xxx分隔符secret),由于md5是单向的(md5其实也不安全了,不过我们的安全性要求也没那么高,换成sha256也可以),攻击者拿到这个摘要字符串也无法逆向出secret。服务端在收到请求后做同样的计算来验证有效性。但这个方法的前提是攻击者无法获取到secret。可是如果客户端被逆向工程破解了呢?由于secret是hardcode在客户端的,如果攻击者看到客户端源码,secret就暴露了。
    对这方面还不了解,欢迎科普。

    另外token是有时效的,默认为1小时。那么在这个有效期内,这个token就可以无限制上传了,所以有效期也不能这么久。

    限制token使用

    通过有效期来限制,感觉并不是完美的解决方法,到底设置多久也是个问题,太短的话可能影响到正常操作,太长的话又失去了意义。

    限制token使用的话最好能做到一次性,用完即失效。
    目前知道的方式是在生成token的时候通过scope来指定文件的key,另外设置insertOnly为1,也就是服务端硬性规定好保存的文件名,重名的话上传是无效的。
    这样一个token就只能上传一个文件。

    以上就是我能想到的方法了,希望大家踊跃分享自己的使用经验!

    5 条回复    2015-07-28 15:09:40 +08:00
    loveltyoic
        1
    loveltyoic  
    OP
       2015-07-28 12:05:10 +08:00
    有木有人来说说你们的经验呐!
    eriale
        2
    eriale  
       2015-07-28 12:47:15 +08:00
    只要用户是登陆用户就可以了吧,服务端可以判断当前请求的用户,然后计算这个用户请求的次数。
    而且上传文件名是服务端给的,所以用户如果在token失效期内频繁上传,也只是覆盖自己以前上传的文件。
    loveltyoic
        3
    loveltyoic  
    OP
       2015-07-28 14:41:43 +08:00
    @eriale 这是给我总结了一下哈。希望听听不同的解决思路。
    另外其实我不想由我的服务端来定文件名。
    因为七牛会对文件内容生成一个etag,也就是说对同一文件,etag是相同的。
    如果不指定文件名的话,就会用etag做文件名。
    利用这个特性,用户上传相同的文件就直接可以由七牛来过滤掉了。
    tabris17
        4
    tabris17  
       2015-07-28 14:46:25 +08:00
    先作为临时文件,上传到自己的服务器,然后推送给七牛后删除临时文件
    gamexg
        5
    gamexg  
       2015-07-28 15:09:40 +08:00
    想用 etag 作为key,你可以试试回调功能。

    http://developer.qiniu.com/docs/v6/api/overview/up/response/callback.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5398 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 07:36 · PVG 15:36 · LAX 00:36 · JFK 03:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.