腾讯云对象存储COS,目前提供了两种防盗刷机制。
- referer头防盗链
- 签名方式防盗链
referer头防盗链,是一种简单有效的防盗链方式。它的实现原理是,COS侧通过判断请求的request的referer头,来验证是否是合法请求,并作出相应的处理动作。
详细文档见:https://cloud.tencent.com/document/product/436/13319
流程图如下:
控制台效果如下
我们用以下referer设置来测试
例如设置
测试结果
看到referer还是有一定效果的,通过白名单的方式,拦截了非指定域名的请求,这种方式容易,但是也会被伪造,不能作为强验证功能。
所以我们需要再介绍一个功能:
签名方式防盗链
签名方法见https://cloud.tencent.com/document/product/436/7778
这需要根据腾讯云账号登录官网,从账号信息处提供的API KEY来进行封装,外部人员无法得到,安全性很高,只要key值不外泄,基本上无法被盗链。
签名流程示意图如下:
签名封装步骤
KeyTime = [Now];[Expires]
SignKey = HMAC-SHA1([SecretKey], KeyTime)
HttpString = [HttpMethod]\n[HttpURI]\n[HttpParameters]\n[HttpHeaders]\n
StringToSign = sha1\nKeyTime\nSHA1(HttpString)\n
Signature = HMAC-SHA1(SignKey, StringToSign)
可以使用COS的签名工具来自动生成签名串
https://cos5.cloud.tencent.com/static/cos-sign/
然后用curl执行put测试请求(示例):
dd if=/dev/zero of=onebox.test bs=50MB count=1
创建一个50MB的文件,并使用curl操作上传
curl -X PUT 'http://xxx-appid.cos.ap-beijing.myqcloud.com/1.jpg' -H 'Authorization:q-sign-algorithm=sha1&q-ak=AKIDjNskW7UnqiO3aSLm9KKD0b1Rr8DQIP8k&q-sign-time=1566369956;1566373556&q-key-time=1566369956;1566373556&q-header-list=&q-url-param-list=&q-signature=924830da300b9cb7d13d37082b02dd186db2049a' -H 'Content-Length: 50000000' -H 'Host: xxx-appid.cos.ap-beijing.myqcloud.com' -F "filename=@onebox.test" -voa
实际执行如下:
这里看到上传成功。并且用到了key的签名计算,安全风险基本为0。推荐使用。
如果觉得得到主账号的key具有一定的风险,实际上我们也可以通过子账号授权和临时账号的方式,进一步控制请求的操作行为和范围。
请参考如下文档,本文章暂不做深入说明。
子账号授权
https://cloud.tencent.com/document/product/598/11084
临时账号授权
https://cloud.tencent.com/document/product/436/9068