详解PHP防止盗链防止迅雷下载的方法


Posted in PHP onApril 26, 2017

防止盗链:

原理:当服务器要我们下载文件的时候,我们会拿到一个链接,然后我们通过这个链接找到这个文件,然后将它下载下来。那么也就是说这个链接必须要有的,那么如何防止盗链呢?那就是给你的链接并不是真正的文件链接了。这一点很容易想到,那么不给你真正的链接又怎样让你下载文件呢?

我们在用php做网页的时候,总是会把php代码穿插在HTML代码中间,然后用php去生成剩下的代码,然后传给客户端,也就是说客户端会接受到我们php脚本运行的结果。也就是说:如果我的php脚本运行的结果就是你要下载的文件。这样我们就实现了文件防盗链。就是说你能得到的链接就是这个php文件,然后再由这个百变php文件变成你想要的文件来供你下载。

代码如下:

$FileAddress : 文件的相对路径。
$DownloadName : 文件下载到客户端的名字。
if(file_exists($FileAddress) && $file=fopen($FileAddress,'r')) { //首先要判断文件是否存在,如果文件跟本不存在的话,后边的代码也是白费。
 Header('content-type:application/octet-stream'); //声明文件类型,这里是为了让客户端下载它,而不是打开它,所以声明为未知二进制文件。否则客户端会根据其文件类型在线打开它。
 Header('content-Length:'.filesize($FileAddress)); //声明文件的大小,告诉客户端这个文件的大小,否则客户端下载的时候看不到进度。
 Header('content-disposition:attachment;filename='.$DownloadName); //声明文件名,这里就是告诉客户端它要下载的文件的名字,否则名字就会是你php文件的名字。
 echo fread($file,filesize($FileAddress)); //这里就是将加载的文件echo出来,因此这个php文件不能出现其他任何的文字,就是说这里若是出现了任何其他的输出的话都会输出到客户端下载的文件里。
 fclose($file); //最后关闭句柄。
}

上边这些代码就成功的胜任了防止盗链的任务,只需要定义那两个变量就可以。那两个变量可以通过GET来获取,比如我们将文件实际链接与它的编号在数据库中做一个映射,我们只需要GET到一个文件ID即可对文件进行下载,保证了我们真实文件地址的安全。当然也可以是对文件真实链接进行加密之类的,总之就是不要讲真实链接再放到客户端可以看到的地方就好。

防止迅雷下载

其实通过上边的代码,我们只能做到链接的隐藏,并不能防止客户端用迅雷等工具对其进行下载。那么如何做到防止用迅雷等工具下载它呢?

正如我之前所说我们可以通过各种途径来使php文件得到这个文件的路径,那么,我们只要不要将这些信息加在链接里边就好了。比如:可以通过POST来传输文件的ID,可以通过session来传输文件的ID。

这就是我所说的:花式授权下载。

1.我们可以在下载的前导页写入客户端session,来储存其授权码,将文件ID也储存进去,然后再在下载的php里加入验证session的代码,这样就算客户端将连接输入迅雷下载也是没有用的。

2.我们可以在下载的前导页加入一个隐藏的表单,用POST提交给实现下载功能的php,这样也能达到防止第三方下载工具下载的目的。

总之这样的方法很多,上面两种方法提供参考,主要的思路就是将要下载文件的信息和链接分开来,这样就可以达到只凭一个链接无法下载文件的目的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP初学者头疼问题总结
Jul 08 PHP
需要发散思维学习PHP
Jun 29 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
开启PHP的伪静态模式
Dec 31 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
php array_values 返回数组的所有值详解及实例
Nov 12 PHP
php实现的网页版剪刀石头布游戏示例
Nov 25 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
PHP微商城开源代码实例
Mar 27 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 #PHP
ThinkPHP中create()方法自动验证实例
Apr 26 #PHP
PHP使用imagick扩展实现合并图像的方法
Apr 25 #PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
Apr 25 #PHP
php读取XML的常见方法实例总结
Apr 25 #PHP
利用PHP实现一个简单的用户登记表示例
Apr 25 #PHP
PHP中的正则表达式实例详解
Apr 25 #PHP
You might like
PHP中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python+opencv实现车道线检测
2021/02/19 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
医药个人求职信范文
2014/01/29 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
大学生个人学习总结
2015/02/15 职场文书
毕业生学校组织意见
2015/06/04 职场文书
龙猫观后感
2015/06/09 职场文书
python保存图片的四个常用方法
2022/02/28 Python