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

loveltyoic · 2015年07月28日 · 最后由 chaucerling 回复于 2015年11月19日 · 4134 次阅读

先说下我的使用场景:

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

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

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

限制 token 获取

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

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

算法采用 sha1 版的 hmac,Ruby 里面就是

Base64.urlsafe_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), secret,"uid=xxx"))

摘要算法是单向的,攻击者拿到这个摘要字符串也无法逆向出 secret。服务端在收到请求后做同样的计算来验证有效性。但这个方法的前提是攻击者无法获取到 secret。可是如果客户端被逆向工程破解了呢?由于 secret 是 hardcode 在客户端的,如果攻击者看到客户端源码,secret 就暴露了。 对这方面还不了解,欢迎科普。

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

限制 token 使用

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

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

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

1,不直传

2, 直传用业务控制:图片先传入私有 bucket 待审核后, 搬到公开的 bucket 后才可外部访问,定期删除未审核的数据。

#1 楼 @huobazi 图片审核也是一个问题啊,开始还没想到这个问题呢。 可是不用直传的话又增加了服务器和开发的负担。 感谢分享

LZ, 你最终的解决方案是什么?我也遇到这个问题

#3 楼 @liwen_zhang 就在回调逻辑里加限制吧,回调中加入用户的 access_token 之类的,限制用户上传次数。

明白了,谢谢分享

可以在策略里加上一个上传任务的序列号,回调时查询是否有这样的任务,获取对应的用户,资源等信息,防止用户 id 或者 token 暴露出来,同时也限制了 token 的使用次数 然后就是尽量用 https

需要 登录 后方可回复, 如果你还没有账号请 注册新账号