如何实现网站的防盗链?

如何实现网站的防盗链?,第1张

可以基于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=189999,可以将这个时间转换成本地时间。在Linux下的命令为date -d@189999,也可以在网络上找工具自行转换。

特别说明

签名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访问日志,能够及时发现盗链活动和验证防盗链方案的有效性。 访问日志参见设置访问日志记录。

又拍云可以通过设置 token 密钥,配合签名过期时间来控制资源内容的访问时限。

token 防盗链的目的是使得每个请求的 URL 都具有一定的 “时效性”,因此 URL 本身需要携带过期时间相关的信息,同时还需要确保这个过期时间,不能被恶意修改,因此采用 md5 算法,将密钥(通常是一个普通字符串)、过期时间、文件路径(过期时间和文件路径通常是有对应关系的,因此也参与 md5 的计算)等信息所计算的 md5 值也加入到 URL 中,CDN 节点在验证请求时,除了验证过期时间,同时还会验证该 md5 值是否匹配,对于不匹配的 md5,说明 URL 被篡改,即使请求未过期也需要禁止服务。

1)在控制台配置秘钥,其中秘钥是一个 32 位以内的数字或英文组合;

2)获取服务器时间 - UNIX TIME类型的 ,可通过 Linux 命令:date +%s,大陆的服务器,默认时间为北京时间

3)利用 MD5 开始加密信息,加密格式为  

秘钥:第一步在 CDN 控制台配置好的

过期时间:即服务器时间+资源可被访问的时间,按秒为单位

URI:即要访问的资源路径(不需要携带服务名)

4)制作 token。

第三步结束后会得到一个 MD5 字符串,32位,取中间 8 位(13-20),加上过期时间就得到了 token。

5)在URL后拼接 token,其中请求 URL 中的验证参数为 _upt

例如:http://iamge-blog.test.upcdn.net/404.jpg ?_upt=bcc3b8331545271510

请注意:

请求 URI 的路径部分,如果有请求参数,计算的时候不包含 ? 及后面的 Query String;

如果有携带缩略图版本,则需要一并纳入 URI 路径进行计算;

如果 URI 里有中文或者空格,制作token的时候不需要 URL 编码

一个 token 对应一个访问资源,也就是 URI 和访问资源是对应的,如果写到某个目录,例如 /b,那么生成的 token 只对 b 目录有效,但是 b 目录下的具体的文件或者子目录还是无法访问的,依旧会提示 invalid user token;

开启了 token 防盗链是全站加密的;

返回错误码及信息为:{ code: "40310013", msg: "invalid user token." }


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/105221.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-10
下一篇2023-03-10

发表评论

登录后才能评论

评论列表(0条)

    保存