用过七牛的来说说你们的安全策略吧 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
loveltyoic
V2EX    问与答

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

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

    先说下我的使用场景:

    上传方式是七牛直传:用户在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     Solana     2675 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 15:06 PVG 23:06 LAX 07:06 JFK 10:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86