背景


A是网站站长,在A的网站的网页里有一些图片和音频视频的链接,这些静态资源都保留在阿里云对象存储OSS上。B是另一个网站的站长,B在未经A允许的情况下,偷偷使用A的网站的图片资源,放置在自己网站的网页中,通过这种方法盗取空间和流量。 在这样的情况下,第三方网站用户看到的是B的网站,网站用户不知道也不关心网站里的图片是来自于哪里。 由于OSS是按照使用量来收费的,这样用户A在没有获取任何收益的情况下,反而承担了资源使用费用。A站应该怎么办呢?

本文就是介绍类似A这样的用户将资源存放在OSS上后,如何设置防盗链来避免这样情况的发生。 本文适用那些在网页中使用了OSS资源作为外链的用户。

具体方案


目前OSS提供的防盗链的方法主要有两种:

  • 设置Referer。控制台,SDK都可以操作,适合不想写代码的用户,也适合喜欢开发的用户;
  • 签名URL,适合喜欢开发的用户。 本文会给一个控制台设置Referer防盗链的具体事例,也会基于PHP SDK给一个动态生成签名URL防盗链的示例。

通过Referer防盗链的具体步骤


第一步:进入 OSS 管理控制台界面。

第二步:单击目标存储空间的名称进入存储空间管理页面。

第三步:单击 Bucket 属性 > 防盗链设置

第四步:单击“设置”添加白名单网址并设置是否允许其为空。

第五步:单击“提交”保存对防盗链的设置。

举例

对于一个名为test-1-001的存储空间,设置其referer 白名单为 http://www.aliyun.com。则只有 referer 为http://www.aliyun.com的请求才能访问oss-example这个存储空间中的对象。

签名URL实现步骤


签名URL的原理和实现方法见OSS开发人员指南授权第三方下载。 签名URL的实现步骤:

1、将Bucket的权限设置为私有读;

2、 根据期望的超时时间(签名URL失效的时间)生成签名。

具体实现

第一步:安装PHP最新代码,参考PHP SDK文档;

第二步:实现生成签名URL并将其放在网页中,作为外链使用的简单示例:

<?phprequire 'vendor/autoload.php';#最新PHP提供的自动加载
use OSS\OssClient;#表示命名空间的使用
$accessKeyId="a5etodit71tlznjt3pdx7lch";#AccessKeyId,需要使用用户自己的
$accessKeySecret="secret_key";#AccessKeySecret,需要用用户自己的
$endpoint="oss-cn-hangzhou.aliyuncs.com";#Endpoint,根据Bucket创建的区域来选择,本文中是杭州
$bucket = 'referer-test';#Bucket,需要用用户自己的
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$object = "aliyun-logo.png";#需要签名的Object
$timeout = 300;#期望链接失效的时间,这里表示从代码运行到这一行开始的当前时间往后300秒
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout); #签名URL实现的函数$img= $signedUrl;#将签名URL动态放到图片资源中并打印出来
$my_html = "<html>";$my_html .= "<img src=\"".$img. "\" />";$my_html .= "<p>".$img."</p>";$my_html .= "</html>";echo $my_html;?>

第三步:通过浏览器访问 多请求几次会发现签名的URL会变,这是正常的。主要是因为过期时间的改变导致的。这个过期时间是链接失效的时间,是以unix time的形式展示的。 例如:Expires=1448991693,可以将这个时间转换成本地时间。在Linux下的命令为date -d@1448991693,也可以在网络上找工具自行转换。

特别说明

签名URL可以和Referer白名单功能一起使用。

如果签名URL失效的时间限制在分钟内,盗链用户即使伪造了Referer也必须拿到签名的URL,且必须在有效的时间内才能盗链成功。 相比只使用Referer来说,增加了盗链的难度。 也就是说签名URL配合Referer白名单功能,可以增加防盗链的效果。

防盗链总结


基于OSS的防盗链最佳实践点如下:

  • 使用三级域名URL,例如referer-test.oss-cn-hangzhou.aliyuncs.com/aliyun-logo.png,安全性比绑定二级域名更高。三级域名方式能够提供Bucket级别的清洗和隔离,能够应对被盗链后的流量暴涨的情况,也能避免不同Bucket间的互相影响,最终提高业务可用性;
  • 如果使用自定义域名作为连接,CNAME也请绑定到三级域名,规则是bucket + endpoint。假如你的bucket名为test,三级域名则为test.oss-cn-hangzhou.aliyuncs.com;
  • 对Bucket设定尽可能严格的权限类别。例如提供公网服务的Bucket设置为public-read或private,禁止设置为public-read-write。Bucket权限参见访问控制;
  • 对访问来源进行验证,根据需要设置合适的Referer白名单;
  • 如果需要更严格的防盗链方案,请参考签名的URL方案;
  • 记录Bucket访问日志,能够及时发现盗链活动和验证防盗链方案的有效性。 访问日志参见设置访问日志记录。

常见问题及解决方案


问:在OSS控制台设置了防盗链,一直不生效,但页面可以防但是播放器不可以,请问为什么?怎么解决?

答:目前设置防盗链不生效的主要问题集中于视频和音频文件, 在使用诸如windows media player,flash player等播放器后,在请求OSS资源的时候传递的Refer为空,这就造成防盗链的失效, 不仅仅把别人防住了,也把自己给防住了。针对这种情况,可以参考上面提到的签名URL防盗链的方法。

问:Referer是什么?怎样才会带上?如果遇到HTTPS怎么办 不需要添加别的了吗,比如逗号之类的?

答:Referer是HTTP协议中的请求头,在跨页面访问的时候会带上。需要看看浏览器请求的Referer是http://还是https://,一般是http://。

问:如何生成签名URL?AccessKeySecret放在客户端里的安全性?

答:签名URL的方法参见各个SDK文档。AccessKeySecret这种不建议直接放在客户端,RAM提供了STS服务可以解决这个问题。也可以参考RAM和STS指南

问:例如要写a.baidu.com和b.baidu.com,这两个用通配符(*,?) 如何写?

答:可以写成http://*.baidu.com,对于这种单字符的也可以写成http://?.baidu.com

问:*.domain.com 可以匹配二级域名,但无法匹配 domain.com 另外添加一行 domain.com 也没效果,如何配置?

答:注意一般的referer中会带http这样的参数,可以通过chrome的开发者模式观察下请求的Referer是什么,然后再具体设置。这里可能是忘了写http://,应该为http://domain.com

问:如果防盗链没有生效怎么办?

推荐使用chrome来查看。打开开发者模式,点击网页,查看HTTP请求中的Referer具体值是什么,对应在OSS中设置的Referer,是否能匹配上。如果还是解决不了,提工单。

相关链接

关于本文的更多细节:https://help.aliyun.com/document_detail/31937.html

防盗链设置:https://help.aliyun.com/document_detail/31901.html

如何实现网站的防盗链?相关推荐

  1. asp.net网站图片防盗链机制示例代码

    经常大家都会在某些网站上看到,该图片属于XXX网站,请到XXXX浏览的一张图片,其实这是一张外链图片,什么意思呢?就是该图片实际上是不属于这个网站的,这个网站只是造了一个图片的链接来显示图片,但是对方 ...

  2. 如何选择适合自己网站的防盗链

    当你的网站被攻击的时候,当你的资源出现异常访问的时候,又或者是你需要一些特殊的对资源访问的限制时,防盗链的选择你一定要看看. 作为一个优秀的当代攻城狮/程序猿,相信好多人在业余时间都会经营一个自己的博 ...

  3. Python爬取mn52网站美女图片以及图片防盗链的解决方法

    防盗链原理 http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么 因此所有防盗链方法都是基于这个Referer字段 ...

  4. 秋天的第一份“干货” I Referer 防盗链,为什么少了个字母 R?

    Referer 为什么叫 Referer?它代表什么意思?在诸多防盗链竞争中它有什么优势? 今天,在聊 Referer 防盗链之前,先来聊聊我们在现实生活中常常碰到的推荐人(Referrer)信息. ...

  5. ASP.NET中利用ashx实现图片防盗链

    盗链的危害我就不说了,网上有很多. 直接分析盗链原理:看下面用httpwatch截获的http发送的数据 GET /Img.ashx?img=svn_work.gif HTTP/1.1 Accept: ...

  6. java 微信图片盗链破解_隐藏图片地址,伪造来路Referer实现绕过微信图片的防盗链机制...

    最近用软件采集微信公众号文章图片下载不了,全是显示盗链图片.没有办法只好上网查询有没有办法解决.在一个朋友那看到了2种解决方案记录下: 微信防盗链 用php写一个绕过的代码,你只需要把php上传到你的 ...

  7. 流媒体直播防盗链安全控制

    转载自:http://blog.csdn.net/u013488847/article/details/45789071 防盗链概念主要是从网站的业务中起来,原有定义只要针对网站内容中的文字,图片被他 ...

  8. 爬虫学习5——requests进阶(cookie登录、防盗链、

    目录 cookies登录 方法一:在提出申请时指定cookie 方法二:使用session,给出登陆的网站和账户密码,后续使用session提出网站申请 防盗链:就是网站的溯源,当前本次请求的上一级是 ...

  9. 防盗链技术及破解方法详细解析

    盗链的定义 此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容. 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比 ...

最新文章

  1. LeetCode_Pascal's Triangle_杨辉三角形(Java实现)
  2. nacos 公共_Springboot,Nacos并向使用研究
  3. vue2.0项目中使用Ueditor富文本编辑器应用中出现的问题
  4. 如何在JavaScript中区分深层副本和浅层副本
  5. 浅谈SQL中存储过程和自定义函数的区
  6. vs studio2015导入本地项目_Visual Studio2019自定义项目模板
  7. 如何卸载电脑oracle,如何完整的卸载ORACLE -电脑资料
  8. linux 0891端口,凯立德导航专用版本号及分辨率、端口、波特率
  9. android ts合并_ts视频合并工具安卓版
  10. 【贵州大学计算机考研1】三本学生考研上岸贵州大学软件工程专硕(附带真题与答案)
  11. 南京大学计算机专业复试面试,南大计算机面试问题汇总及部分答案.doc
  12. 前端实现简单的loding效果
  13. 2015年3月1日起停止提供4年或5年SSL证书
  14. matlab 写netcdf,写入 netCDF 属性
  15. Docker查看container的详细信息啥的*
  16. java8中的lambda表达式实用详解
  17. 如何实现百度mapv开源库与ol3的结合
  18. 送女友什么礼物最有意义?比较有纪念意义的礼物推荐
  19. android dataBinding 与ObservableField实现双向绑定
  20. 【SwiftUI模块】0007、SwiftUI新手指引-新手指示-聚光灯介绍说明

热门文章

  1. vs2010资源视图(Resource View)空白问题
  2. 如何使用 Windows 自带的磁盘管理来调整分区?
  3. 荣耀9x会更新鸿蒙吗,荣耀9x会搭载鸿蒙系统吗?荣耀9x搭载鸿蒙系统的时间是什么...
  4. 【算法】SGM半全局匹配+多线程SIMD256优化
  5. Python中反斜杠u类型(\uXXXX)字符串转换为Unicode字符串
  6. #include的方括号与双冒号的区别
  7. 计算机无限代码出招表,《FATE/无限代码 携带版》系统详解 人物性能研究及连续技视频...
  8. 如何驱动光耦?计算相关参数?使电路正常工作
  9. jQuery方法报错...is not a function问题
  10. xpt格式批量转成sas格式