【问题标题】:Compare hash using .htaccess file before downloading file在下载文件之前使用 .htaccess 文件比较哈希
【发布时间】:2019-09-15 05:17:38
【问题描述】:

TLDR:是否可以使用 Apache .htaccess 文件比较附加到下载文件 URL 的 GET 参数中提供的 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&timestamp=0000000&hash=68761328

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

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

【问题讨论】:

    标签: apache .htaccess


    【解决方案1】:

    如果“.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 可以处理很多。

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

    【讨论】:

    • 这是非常有用的信息,您的想法也很好,有些也非常接近我的思维过程 - 我将查看 Apache 文档,看看我可以与表达式有多接近。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多