【问题标题】:Lock access to PDF files by direct link通过直接链接锁定对 PDF 文件的访问
【发布时间】:2018-08-27 15:40:44
【问题描述】:

您好希望在我的网站上为每个用户放置 1 个 PDF 文件。该文件具有用户 ID.pdf 并由 phc 生成。它大约有 1500 个 PDF,每个用户都通过 ID 打开它们。问题是如果其他用户将链接更改为其他名称可以看到其他 PDF 文件,他只需要使用正确的 ID 号。

如何限制访问?

【问题讨论】:

    标签: php html mysql sql


    【解决方案1】:

    这样的事情应该会有所帮助:

    我已将$current_user 定义为123。显然更改此代码,以便您根据当前处理身份验证的方式准确设置此变量的值。

    下一步是将所有 PDF 文件移动到不可通过网络访问的目录中。这意味着无法通过在地址栏中输入 URL 来访问 PDF。

    完成后,定义路径,$pdf_path 到包含 PDF 文件的目录。

    然后您可以转到script.php?user=123。如果user 的值与$current_user 匹配,则PHP 代码将获取相应的PDF 文件,然后将其输出给用户。如果您尝试将 user 指定为与​​您登录时的值不同的值,那么您将看到错误消息。祝你好运..

    <?php
    
    $current_user = 123;
    $pdf_path = '/home/pdfs/' . $current_user . '.pdf';
    
    if($current_user == $_GET['user']) {
    
        header('Content-Type: application/pdf');
        header("Content-Transfer-Encoding: Binary");
        header("Content-disposition: attachment; filename=".$current_user.".pdf");
        readfile($pdf_path);
        exit;
    
    } else {
    
        echo "You do not have permission to access this file";
    
    }
    

    【讨论】:

    • 注意$current_user 不能设置为../../etc/passwd 之类的东西或危险的东西。
    • 但是如果我有大约 3000 个用户,那么将每个文件添加到每个用户是很耗时的。
    【解决方案2】:

    这里的问题是,您正在以一种可以通过更改 URL 来枚举它们的方式来识别资源。即使是大公司也陷入了这些“黑客行为”,因此您最好意识到这个问题并希望避免它。

    有两种方法可以解决这个问题。

    1. 确保每个资源都有一个随机标识符,即它不以任何方式链接到用户 ID。一个 UUID、12 个或更多字母的随机字符串或 20 个数字的随机数应该足够了。这些需要提前生成并存储在数据库中,否则您将无法追踪谁拥有什么文件。
    2. 使用确定性哈希生成标识符,如 SHA2-256,基于用户 ID 和其他一些秘密因素,如密钥,因此无法猜测。 6B86B273FF3...B7875B4B 可能看起来是随机的,但它只是“1”的 SHA2-256 哈希值,攻击者会知道这一点。确定性哈希的优点是您可以随意计算它,您无需将其保存在任何地方。您可能不需要整个哈希,50-70% 的长度肯定足够独特,因为与此的冲突被设计为在数学上几乎是不可能的。

    在任何一种情况下,您都需要根据您的方案命名文件,而不是按用户 ID。

    【讨论】:

    • 但是生成的 pdf 太多,无法在没有 sql 数据库的情况下通过 id 找到的 1 x 1 atm 插入。我有其他 pdf 文件是 1 接 1 插入的,最后我用 ID 随机命名,运行良好。但是插入这么多 pdf 1 by 1 需要太长时间,因为现在是 1500,但有些时候是每月 3000。
    • 重命名 1500-3000 个文件应该不会太难。使用简单的脚本可能需要
    • 我去尝试做那个提示。让我们看看我是否可以在创建每个文件名后将最终名称和 ID 打印到表格中。
    • 成功我在dos中做到了,我打印到一个没有扩展名的txt文件保存名称= Id,然后我打印新的随机名称和/在两者中间,这样我就可以将它们拆分并发送到sql桌子。泰来帮忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多