<?php $ADMIN = array('defaulturl'=>'http://blog.qita.in/images/banner-header.gif',//盗链返回的地址'url_1' =>'http://blog.qita.in/file','url_2' =>'http://blog.qita.in/file1', ) $okaysites = array( 'http://qita.in','http://blog.qita.in', //白名单'http://blog.qita.in/1.html', ) $reffer = $_SERVER['HTTP_REFERER'] if ($reffer) {$yes = 0 while (list($domain, $subarray) = each($okaysites)) { if (ereg($subarray, "$reffer")) {$yes = 1 }}$theu = 'url_' . $_GET['site'] $file = $_GET['file'] if ($ADMIN[$theu] and $yes == 1) {header("Location: $ADMIN[$theu]/$file") } else { header("Location: $ADMIN[defaulturl]") } } else {header("Location: $ADMIN[defaulturl]") } print_r($_SERVER['HTTP_REFERER']) ?>
一般的下载的步骤:查找->输出查找结果列表->进入软件详细页面->点击下载按钮->打开下载页面->点击下载,开始下载我的方法就是在下载页面做文章
首先在网站的公共文件里定义一个$key=sdkfjwojf32413这相当于一个密钥一样
在下载页面生成一个随机数:$certcode = '84615354' (每次打开生成的都不一样)
然后用以上两个变量和软件的ID生成一个md5()加密串
然后生成软件的真实下载地址:file.php?id=5&codekey=ksfjwofsdkfsf
这里的id是软件的编号可以根据他从数据库找到软件地址 $codekey=md5($id.$certcode.$key)
然后把certcode保存到session里,
在file.php的参数里面得到的codekey和id再从公共文件里得到$key 再从session里得到$certcode
对codekey进么验证,看是否正确,如果不正确就退出,否则就进行如下 *** 作
1、删除session(再次打开这个地址就无效了)
2、从数据库里读取软件地址,然后读取软件内容,并输出(用PHP的文件读取方法输出要下载的软件内容而不是直接把地址给他下载)
这样如果要下载,就必须打开你自己的下载页面,从你的下载页面打开地址才能进行下载,而且下载地址每次都不一样,因为生成的随机数不一样
别的地方就算连到你的下载地址,也是下载不了的。
可以基于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访问日志,能够及时发现盗链活动和验证防盗链方案的有效性。 访问日志参见设置访问日志记录。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)