【问题标题】:Renaming a folder for each download为每次下载重命名文件夹
【发布时间】:2011-05-24 09:09:39
【问题描述】:

编辑:我们允许在提交简单表单后下载我们的产品。

为了避免“非法网站”的所有者了解我们的产品下载位置,我正在考虑在每次下载后重命名下载文件夹。

我如何在 PHP 中做到这一点?

【问题讨论】:

  • 嗯...您能说明一下您的目标和目的吗?初读时听起来有点可笑。
  • 为确保您的产品安全无虞,请将它们藏在地板下,他们从地板下看....
  • 如果您的付费软件可以通过直接链接从您的服务器获得,那么您值得人们使用该链接下载它而无需付费。
  • 我改进了我的问题,我们没有直接链接,但他们总能找到文件所在的位置并直接下载它们。

标签: php download


【解决方案1】:

相反,验证经过身份验证的会话,然后通过 PHP 流式传输下载。

那么如果有任何非法网站试图下载你的文件,他们会发现他们需要先进行身份验证。

【讨论】:

  • 更具体的我的目的?
  • 通过 PHP 流式下载下载是什么意思?
  • @devdept 基本上是NathanD's answer 在做什么。
【解决方案2】:

不要重命名目录。如果多个用户同时下载文件,它将中断。而是通过 PHP 提供文件,例如:

<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');

// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf
readfile('original.pdf');
?>

【讨论】:

  • 有意思,这样没人知道文件在下载服务器上的位置?
  • +1 假设此脚本还检查是否允许用户下载。否则,这与直接链接完全相同,因为 URL 不会更改 (@dev)。
  • @devdept - 是的,它甚至可以放在网络根目录之外。 @deceze - 同意,在执行此代码之前必须验证用户。
【解决方案3】:

是的,你可以使用rename PHP 函数来做到这一点,但有什么奇怪的方法?您最好为可以通过 HTTP 请求访问和不能访问的文件自定义访问设置。让注册用户下载文件并使用用户会话 cookie 从机器人中识别真实用户,如果这些文件非常重要,则可能添加验证码。

【讨论】:

    【解决方案4】:

    一种可能的解决方案可能是执行 PHP 系统调用以创建到安装程序的临时软链接,并在固定时间后删除该软链接。

    但实际上,在保护您的安装程序方面,您似乎有一个错误的想法。

    【讨论】:

    • 如何创建指向我们安装程序的软链接?
    • 好吧,假设您正在运行 linux 服务器,使用 ln 命令。但话又说回来,会话是一个更好的主意。
    【解决方案5】:

    一个好方法是使用 .htaccess 和 key 的组合

    .htaccess
    RewriteEngine On
    
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteRule ^([^\.]+)/([a-z0-9]+/i)$ serve.php?file=$2&key=$1 [NC,L]
    

    在有人购买您的文件后,在 mySQL 中的客户帐户中设置密钥和 ip,通过电子邮件 (http://yoursite.com/key1234567/your.pdf) 向他们发送下载链接,注意他们只能下载一次

    用户点击下载

    然后使用serve.php

    您在该帐户中对照那里的 ip 检查密钥并标记为已下载

    sql check on ip and key match
    
    
    if($allowedToDownload===true){
        header('Content-type: application/pdf');
    
        // It will be called downloaded.pdf
        header('Content-Disposition: attachment; filename="downloaded.pdf"');
    
        // The PDF source is in original.pdf
        readfile('hidDen_ArEa/'.basename($_REQUEST['file']));
        }
    

    【讨论】:

      【解决方案6】:

      没有什么私人的,但这不是最聪明的主意。
      检查$_SERVER['HTTP_REFERER'] - 如果此变量为空且不包含预下载页面的地址,则将用户重定向到您的某些预下载页面。

      编辑:检查HTTP_REFERER 并不是 100% 防止僵尸程序,但其他方法(例如身份验证)可能对用户来说更烦人。

      此外,还可以使用会话或 cookie(带有临时令牌)。

      【讨论】:

      • HTTP_REFERER 不能被信任。在某些用户环境中,它可能始终为空,即使用户没有恶意。
      • @bazmegakapa,是的,你是对的,这就是我写会话和 cookie 的原因。检查HTTP_REFERER 这是最简单的方法。
      • @OZ_:在什么情况下 $_SERVER['HTTP_REFERER'] 为空?
      • @bazmegakapa,当用户来自另一个站点(不是来自预下载页面),或者当它是机器人,或者在用户的浏览器中关闭选项“发送推荐人”时。
      • @devdept 机器人不能那么聪明地伪装成人类,因此不会通过 HTTP_REFERER(机器人开发人员会很快弄清楚!)。在某些情况下,某些浏览器也不会通过引用。
      【解决方案7】:

      目前最好的解决方案如下:http://www.devshed.com/c/a/PHP/Simple-and-Secure-PHP-Download-Script-with-Limits-Tutorial/

      感谢大家指导我采用这种方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        相关资源
        最近更新 更多