首页 > 解决方案 > 在下载文件之前使用 .htaccess 文件比较哈希

问题描述

TLDR:是否可以GET使用 Apache .htaccess 文件比较附加到下载文件 URL 的参数中提供的 SHA1(或 MD5)哈希?如果哈希匹配,则提供文件,否则显示权限被拒绝错误。

这是我想做的事情:

首先,我有一个 Apache Web 服务器,我想用它来为用户提供静态文件。这些文件将是 PDF 文档/文本文件/图像/视频等。我想直接拒绝对这些文件的所有访问。我不想使用像 PHP 这样的脚本语言来提供这些文件,因为有些文件非常大。

接下来,我有一个单独的服务器,我将使用它来生成访问这些文件的链接。这些链接将包含一个安全哈希密钥(我在想 SHA1)。所以像(以PHP为例):

$access_token = sha1($file_name . $user_ip . $timestamp . $secret_salt);

然后我将提供给用户的链接将指向第一台服务器,看起来像(例如):

` https://www.example.com/?file=readme.txt&ip=192.168.0.1×tamp=0000000&hash=68761328

当用户点击链接时,我希望 Apache 服务器根据提供的参数生成哈希,secret_salt并将其与用户提供的哈希进行比较。如果它们匹配 - 那么 Apache 可以提供文件,否则它应该显示权限被拒绝。

过去,我使用 .htaccess mod_rewrite 对 URL 参数或 Cookie 等进行简单比较。.htaccess 是否提供了这种比较安全哈希值的能力?

标签: apache.htaccess

解决方案


这不是“.htaccess 是否提供...”——htaccess 只是一个配置文件,但与 apache 启动时读取的主 apache 配置不同,每次访问文件夹时都会读取 htaccess。

因此,第一个问题是,您运行的是什么版本的 Apache?2.4 版添加了 IF/ELSEIF/ELSE 逻辑和新的表达式语法。

下一个问题是,你能通过重写来完成这一切吗?您需要创建散列——表达式语法中有一些散列生成功能可能允许这样做。它可能需要是 PHP/Java/ap_exp 的组合。

htaccess 或 conf

如果您可以访问主配置文件,则将所有重写内容放在那里通常会更好地提高性能,因为每次访问文件夹时都会读取 htaccess 文件,因此对性能的影响很小。

一些想法

在我被另一个项目牵制之前,我正在研究一种类似于您所描述的反热链接策略。您可能想谷歌反热链接,因为有很多解决方案。

我遇到的一个问题是哈希或下载 UL 的有效期应该多长?什么应该导致它过期?因为如果它要具有足够长的寿命以用于实际目的,则可能需要针对不同程度的到期比较多个哈希值。

当然,您必须使散列过期 - 如果它是持久散列,用户需要做的就是在他们的热链接中使用相同的散列。同时,您不希望通过过期干扰下载来给用户带来不便。

所以我一路上的一些想法:

  • 使用 cookie 控制过期和对文件服务器的访问
  • 为每个请求的文件创建一个符号链接,并使用符号链接名称的哈希值,然后使用 cron 作业删除所有超过 n 小时的符号链接。
  • 使用奇数/偶数小时(奇数哈希在每个奇数小时的顶部过期,用户根据他们请求的小时获得奇数或偶数哈希,因此他们总是有至少一个完整小时来完成下载)。
  • 与其中一些一起使用反向代理文件服务器(在防火墙后面)。

我个人大部分是在 PHP 中完成的,但我认为 Apache Expressions 可以处理很多。

虽然这不是一个直接的答案(需要一些组装),但我希望它对您有用。


推荐阅读