架构基于DZ或PW论坛的文件防盗链系统
时间:2009-12-14
来源:互联网
需求:
一个技术/娱乐论坛 http://bbs.mowai.com 有大量电影和ISO文件。
文件存放于论坛目录下,结构如下:
/bbs/download/蜘蛛侠3.rm——电影和ISO文件
/bbs/index.php—————论坛首页
/bbs/…
/index.php ——————-首页
原来使用 http://bbs.mowai.com/download/蜘蛛侠3.rm 这样的链接提供用户下载文件.
但被无良的迅雷和一些网站等严重盗链.服务器带宽被耗尽, 急需解决.
1.尽量不改变原有下载路径.否则需要编辑大量主题.
2.可以设置非网站注册会员需要登录方可下载.
思路:
一.和论坛绑定,需要引入论坛文件以判断用户是否登录.
二.如果没有限制游客下载,那么需要判断HTTP_REFERER是否来自本站,以达到简单防盗功能.
三.[重点] 为了防盗,最简单的方法还是更改文件名.一个文件,一天就失效了.那盗链就变得没有意义.
开始实施:
1.
—————————————————————
新建一个文件夹 /bbs/download_file_in_here ,并在它下面建立一个乱码文件夹,如De7Tvs9K 将 /bbs/download/ 目录下的所有文件移动到/bbs/download_file_in_here/De7Tvs9K 下,
并给它绑定一个域名:http://download.mowai.com
—————————————————————
2.
—————————————————————
加一条 rewirte 到虚拟主机设置里.
<Directory “/www/bbs.mowai.com”>
<FilesMatch “^download$”>
ForceType application/x-httpd-php
</FilesMatch>
</Directory>
也可以写 .htaccess 文件来实现.目的是实现用PHP来处理download文件
—————————————————————
3.
—————————————————————
新建一个 time.txt 文件,位于 /bbs/ 目录下.内容为:De7Tvs9K 就是上面那个乱码文件夹
—————————————————————
新建一个名为 download 的php文件在 /bbs/ 目录下(注意,这个文件没有后缀名)
代码如下:
<?php
header(‘Content-type:text/html;charset=utf-8′);
define(‘CURSCRIPT’, ‘download’);
require_once ‘./include/common.inc.php’;
$down_uri = ‘http://download.mowai.com/’; //绑定的域名 以/结尾
$allow_guest_download = 1; //是否允许游客下载 1=是 0=否
$referer_verify = 1; //是否验证referer来源.在允许游客下载的情况下,是否允许非本站用户下载.
$referer_uri_list = array(‘www.phpv.net’,‘esayr.com’); //允许的referer来源网站.上一项值为1时生效.
$interval_time = 24; //间隔多少个小时,更改一次文件夹名。
$filename = ‘time.txt’; //保存文件夹路径的文本文件.if (file_exists($filename)) {
$last_m_time = filemtime($filename);
$directory_name = file_get_contents($filename);
//判断时间是否到期
if(time() - $last_m_time > $interval_tim*3600 ) {
$new_directory_name = random(12);
if (is_writable($filename)) {
if (!$handle = fopen($filename, ‘a’)) {
exit(“不能打开文件 $filename”);
}
//更改文件夹名
if (rename(“bbs/”.$directory_name, “bbs/”.$new_directory_name)) {
//将新的目录名写入到time.txt文件中。
if (fwrite($handle, $new_directory_name) === FALSE) {
//如果改文件内容失败,把文件夹名改回来
rename(“bbs/”.$new_directory_name,“bbs/”.$directory_name);
exit(“不能写入到文件 $filename”);
}
$directory_name = $new_directory_name;
} else {
exit(“文件夹改名失败”);
}
fclose($handle);
} else {
exit(“文件 $filename 不可写”);
}
}
}else{
exit(‘文件 $filename 不存在,请创建一个’); //没有time.txt文件,请创建一个。
}
/*################### 游客检查 #############*/
if(!$allow_guest_download && !$discuz_uid) {
//exit(’此操作需要登录!您尚未 <a href=”http://bbs.mowai.com/logging.php?action=login”>登录</a>’);
header(“Location: http://www.mowai.com/error/need_login.html”);
exit;
}
/*################### 来源检查 #############*/
preg_match(“/https?:\/\/([^\/]+).*/i”, $_SERVER['HTTP_REFERER'],$matchs);
if($referer_verify && !in_array($matchs[1],$referer_uri_list)) {
header(“Location: http://www.mowai.com/error/invalidreferer.html”);
//exit(’您要下载的文件位于http://bbs.mowai.com’);
}else{
if(isset($_SERVER['PATH_INFO'])){
//这里可以加一些判断文件是否存在而出现错误提示的信息。
header(“Location:{$down_uri}{$directory_name}/{$_SERVER[PATH_INFO]}”);
}
else {
header(“Location: http://www.mowai.com/error/404.html”);
}
}
?>
代码在linux+DZ5.5.0 下运行成功.
需要注意的几点
如果是*nix系统,请将time.txt的文件属性设置为777
如果要下载的文件在远程计算机,请使用PHP的FTP命令来做更名操作.
PW论坛,根据情况改改代码就行了.
原文地址 http://www.esayr.com/2007/05/22/archives_9.html
一个技术/娱乐论坛 http://bbs.mowai.com 有大量电影和ISO文件。
文件存放于论坛目录下,结构如下:
/bbs/download/蜘蛛侠3.rm——电影和ISO文件
/bbs/index.php—————论坛首页
/bbs/…
/index.php ——————-首页
原来使用 http://bbs.mowai.com/download/蜘蛛侠3.rm 这样的链接提供用户下载文件.
但被无良的迅雷和一些网站等严重盗链.服务器带宽被耗尽, 急需解决.
1.尽量不改变原有下载路径.否则需要编辑大量主题.
2.可以设置非网站注册会员需要登录方可下载.
思路:
一.和论坛绑定,需要引入论坛文件以判断用户是否登录.
二.如果没有限制游客下载,那么需要判断HTTP_REFERER是否来自本站,以达到简单防盗功能.
三.[重点] 为了防盗,最简单的方法还是更改文件名.一个文件,一天就失效了.那盗链就变得没有意义.
开始实施:
1.
—————————————————————
新建一个文件夹 /bbs/download_file_in_here ,并在它下面建立一个乱码文件夹,如De7Tvs9K 将 /bbs/download/ 目录下的所有文件移动到/bbs/download_file_in_here/De7Tvs9K 下,
并给它绑定一个域名:http://download.mowai.com
—————————————————————
2.
—————————————————————
加一条 rewirte 到虚拟主机设置里.
<Directory “/www/bbs.mowai.com”>
<FilesMatch “^download$”>
ForceType application/x-httpd-php
</FilesMatch>
</Directory>
也可以写 .htaccess 文件来实现.目的是实现用PHP来处理download文件
—————————————————————
3.
—————————————————————
新建一个 time.txt 文件,位于 /bbs/ 目录下.内容为:De7Tvs9K 就是上面那个乱码文件夹
—————————————————————
新建一个名为 download 的php文件在 /bbs/ 目录下(注意,这个文件没有后缀名)
代码如下:
<?php
header(‘Content-type:text/html;charset=utf-8′);
define(‘CURSCRIPT’, ‘download’);
require_once ‘./include/common.inc.php’;
$down_uri = ‘http://download.mowai.com/’; //绑定的域名 以/结尾
$allow_guest_download = 1; //是否允许游客下载 1=是 0=否
$referer_verify = 1; //是否验证referer来源.在允许游客下载的情况下,是否允许非本站用户下载.
$referer_uri_list = array(‘www.phpv.net’,‘esayr.com’); //允许的referer来源网站.上一项值为1时生效.
$interval_time = 24; //间隔多少个小时,更改一次文件夹名。
$filename = ‘time.txt’; //保存文件夹路径的文本文件.if (file_exists($filename)) {
$last_m_time = filemtime($filename);
$directory_name = file_get_contents($filename);
//判断时间是否到期
if(time() - $last_m_time > $interval_tim*3600 ) {
$new_directory_name = random(12);
if (is_writable($filename)) {
if (!$handle = fopen($filename, ‘a’)) {
exit(“不能打开文件 $filename”);
}
//更改文件夹名
if (rename(“bbs/”.$directory_name, “bbs/”.$new_directory_name)) {
//将新的目录名写入到time.txt文件中。
if (fwrite($handle, $new_directory_name) === FALSE) {
//如果改文件内容失败,把文件夹名改回来
rename(“bbs/”.$new_directory_name,“bbs/”.$directory_name);
exit(“不能写入到文件 $filename”);
}
$directory_name = $new_directory_name;
} else {
exit(“文件夹改名失败”);
}
fclose($handle);
} else {
exit(“文件 $filename 不可写”);
}
}
}else{
exit(‘文件 $filename 不存在,请创建一个’); //没有time.txt文件,请创建一个。
}
/*################### 游客检查 #############*/
if(!$allow_guest_download && !$discuz_uid) {
//exit(’此操作需要登录!您尚未 <a href=”http://bbs.mowai.com/logging.php?action=login”>登录</a>’);
header(“Location: http://www.mowai.com/error/need_login.html”);
exit;
}
/*################### 来源检查 #############*/
preg_match(“/https?:\/\/([^\/]+).*/i”, $_SERVER['HTTP_REFERER'],$matchs);
if($referer_verify && !in_array($matchs[1],$referer_uri_list)) {
header(“Location: http://www.mowai.com/error/invalidreferer.html”);
//exit(’您要下载的文件位于http://bbs.mowai.com’);
}else{
if(isset($_SERVER['PATH_INFO'])){
//这里可以加一些判断文件是否存在而出现错误提示的信息。
header(“Location:{$down_uri}{$directory_name}/{$_SERVER[PATH_INFO]}”);
}
else {
header(“Location: http://www.mowai.com/error/404.html”);
}
}
?>
代码在linux+DZ5.5.0 下运行成功.
需要注意的几点
如果是*nix系统,请将time.txt的文件属性设置为777
如果要下载的文件在远程计算机,请使用PHP的FTP命令来做更名操作.
PW论坛,根据情况改改代码就行了.
原文地址 http://www.esayr.com/2007/05/22/archives_9.html
作者: zhoulian 发布时间: 2009-12-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28