阻止直接http

时间:2015-09-02 20:12:20

标签: php

我的问题似乎与SO中的其他人类似,我尝试了一些,但它似乎在我的情况下不起作用......
我开发了一个网站,你必须填写一个表格然后它返回一个PDF文件,你可以下载或打印,这个文件保存,以便你以后检索它

public_html
      |_index.php
      |_<files>
      |    |_file_001.pdf
      |    |_file_002.pdf
      |_<asstes> ....etc

这就是我的文件和文件夹在服务器上的外观,任何人都可以轻松猜出其他文件.com/folder/file_00X.pdf,其中X可以更改任何其他数字并获取文件...用户完成后使用表单脚本返回一个网址.com/file/file_001.pdf,以便他/她可以点击它下载...
一年前我做了类似的脚本生成PDF,但在这种情况下,用户需要电子邮件和通过电子邮件发送的代码,以生成PDF和PDF按需生成没有像这种情况那样保存...... 有没有办法保护这些文件,因为它们现在是什么? 或者,我是否必须让它更难猜测? 类似的东西。
.com/files/HASH(MD5)(MICROTIME)/file_(MICROTIME)_001.pdf
并将文件和文件夹名称保存在数据库中,以便通过管理面板轻松访问,用户必须通过电子邮件获取完整的URL ...

非常感谢任何想法。

3 个答案:

答案 0 :(得分:2)

为了获得完全的安全性,我会将PDF移出公共文件夹,并负责提交内容。如果表单填写正确,您可以生成临时哈希并将该哈希和pdf路径存储在数据库中。这样,用户可以通过检索器脚本访问该文件作为链接,但您将控制他将该链接可用多长时间。

想象一下临时链接是http://yourdomain/get_pdf/THIS_IS_THE_HASH

答案 1 :(得分:1)

  • 将PDF移至某个非公共文件夹(您的网络服务器可以访问但公众不能访问)。或者您可以使用.htaccess限制访问当前位置的pdf。

  • 编写一个php脚本,根据http变量传递的内容返回正确的pdf。

您可以按照自己的方式保护/限制 例如,一个答案建议使用临时哈希。

限制访问的其他选项:

  • 在用户的会话中存储他们提交表单并等待下载,这样就没有人可以直接链接。
  • 检查引荐来源标头。如果是直接请求,则不要提供该文件。

以下是使用最后一个选项的代码示例:

$hash_or_other_identifier = $_REQUEST["SomeVariable"];

if (!$_SERVER["HTTP_REFERER"])
{
    //dont serve the file
} else {
    //lookup the file path using the $hash_or_other_identifier
    $pdfFile = somelogic($hash_or_other_identifier);

    //serve the correct pdf
    die(file_get_contents($pdfFile));
}

我甚至不认为保密文件名是非常重要的,如果您担心的是人们在URL栏中输入它,因为您只需检查它是否是直接链接。如果您还担心机器人或聪明人会创建指向您的文件的链接,使其看起来像推荐人,那么您将需要添加更严格的检查。例如,您可以验证引荐来源是您自己的网站。当然标题可能是欺骗性的,所以这一切只取决于它需要的防弹性。

网址类似于:http://yourdomain/pdf?SomeVariable=12345

但是,您不必使用http变量。您还可以使用具有相同结果的url片段,例如:http://yourdomain/pdf/12345

答案 2 :(得分:1)

一般准则:

  • 文件不在可通过HTTP访问的目录中
  • 使用数据库或任何其他存储将文件位置与标识符(自动递增的数字,guid,哈希,您认为合适的任何内容)链接起来。文件的位置可以位于服务器的文件系统中,也可以位于共享网络位置等。
  • 代替哈希,加密数据库生成的ID,base64对其进行编码并将其提供回来也是切实可行的 - 这使得几乎不可能猜出需要发回的有效字符串以引用文件
  • 如果用户身份验证通过,则使用提供文件的PHP脚本(如果您需要经过身份验证的用户才能检索文件)