php防止盗链最简单的方法


之前那些script直接跳出对话框的,在google的chrome还是能够直接得到下载地址。
用伪静态的话,也很麻烦要设置服务器的支持。故在网络上学习了一些思路,自己也写了一个下载系统。其实可以写在一个文件,但是怕不符合以后的拓展。所以现在是两个文件,暂时还没连数据库,只是将思路和原理写出来了,测试成功!
思路:
两个文件:download.php 和 downfile.php。前者是放广告和统计的页面,后者是直接header输出文件。
在两个文件(或者引入一个公共文件)里定义一个相同的$key='woshiyigemiyao';
(密钥)
download.php文件:
预先定义的共同秘钥:$certKey='woshiyigemiyao';
生成一个随机数:$certNum = rand(1000,9999);
然后用以上两个变量和$_GET[id]得到的软件的id生成一个md5()加密串
$code = md5($certKey.$fileID.$certNum);
然后把$certNum保存到session里:$_SESSION['tmpnum'] = $certNum;

然后生成软件的真实下载地址:downfile.php?id=1234&
code=f103ec4a0f7abe74204e53e83afee84d
downfile.php文件:
在downfile.php的参数里面得到的id和code;
从session里得到$code;
从公共文件里得到$key ;

$code = md5($certKey.$_GET['id'].$_SESSION['tmpnum']);
然后将md5得到的$code和$_GET到的code对比验证,正确就进行如下操作:
1、删除session(其他浏览器打开这个地址就无效了);
2、从数据库里读取软件地址,然后fread,并输出(用php的文件读取方法输出文件内容而不是直接把地址给他下载);
如果两个code对不上,就退出exit;
这样子下载就不会绕过广告获利页,必须从download.php跳转的才有效,也能够后台监控流量。下载地址每次都不一样
其他人得到了下载地址转发给人也没用,下载不了文件。

这个就是思路,两个文件是:

<?php
header("Content-type:text/html;charset=utf-8");
session_start();
$certKey = 'CERT22222';
$fileID = 99;
$certNum = rand(1000,9999);
$code = md5($certKey.$fileID.$certNum);
$_SESSION['tmpnum'] = $certNum;
echo '下载地址:<a href="downfile.php?id='.$fileID.'&code='.$code.'">xiazaiba</a>';
?>
<?php
header("Content-type:text/html;charset=utf-8");
session_start();
$certKey = 'CERT22222';
$file_name = "za.zip";
$file_dir = "";
if (isset($_GET['id']) && isset($_GET['code'])) {
    $code = md5($certKey.$_GET['id'].$_SESSION['tmpnum']);
    if ($code == $_GET['code']) {
        echo 'hefa!!!!!!!!!';
        if (!file_exists($file_dir.$file_name)) {
            //检查文件是否存在
            echo "文件找不到";
            //exit();
        } else {
            $file = fopen($file_dir.$file_name,"r");
            // 打开文件
            //输入文件标签
            Header("Content-type: application/octet-stream");
            Header("Accept-Ranges: bytes");
            Header("Accept-Length: ".filesize($file_dir . $file_name));
            Header("Content-Disposition: attachment; filename=" . $file_name);
            // 输出文件内容
            echo fread($file,filesize($file_dir.$file_name));
            fclose($file);
            //exit();
        }
    } else {
        echo 'feifeifeifa!!!';
        //exit(0);
    }
}
session_destroy();
?>

打完收工!有空再做数据库和其他完善。


原文链接:https://blog.yongit.com/note/77700.html