page contents

PHP如何防止防盗链与防止客户端下载

先来看看防止盗链的原理:当服务器要求我们下载文件时,我们将获得一个链接,然后通过该链接找到文件,然后下载它。 因此,换句话说,此链接必须存在,那么如何防止盗链? 也就是说,指向你的链...

先来看看防止盗链的原理:
当服务器要求我们下载文件时,我们将获得一个链接,然后通过该链接找到文件,然后下载它。 因此,换句话说,此链接必须存在,那么如何防止盗链? 也就是说,指向你的链接不是真实的文件链接。 这很容易想到,因此如何在不提供真正链接的情况下下载文件?


如何防止防盗链
当我们使用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获得。 例如,我们将文件的实际链接及其编号映射到数据库中。 我们只需要获取文件ID即可下载文件,从而确保我们真实文件地址的安全。 当然,它也可以加密文件的真实链接。 简而言之,不要谈论真正的链接将其放在客户可以看到的地方。


防止客户端的下载

实际上,通过上面的代码,我们只能隐藏链接,并且不能阻止客户端比如迅雷,旋风等工具下载链接。 那么如何防止使用这些客户端的下载呢?
如前所述,我们可以通过多种方式使php文件获得该文件的路径,因此我们仅将这些信息不添加到链接中即可。 例如,可以通过POST发送文件的ID,并且可以通过会话发送文件的ID。
这就是我说的:花式授权下载。
1.我们可以在下载首页中编写客户端会话session以存储其授权代码,存储文件ID,然后在下载的php中添加代码以验证会话session,这个时候即使客户端进入连接并输入下载也是没用的。
2.我们可以在下载首页添加一个隐藏的表单,然后将其提交给使用POST实现下载功能的php。 这也可以阻止第三方下载工具的下载。
简而言之,有许多这样的方法。 以上两种方法提供参考。 主要思想是将要下载的文件的信息与链接分开,从而可以实现仅基于一个链接下载文件的目的。

  • 发表于 2020-02-12 16:57
  • 阅读 ( 457 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章