通过直接链接锁定对PDF文件的访问

时间:2018-08-27 15:40:45

标签: php html mysql sql

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

您如何限制访问权限?

2 个答案:

答案 0 :(得分:1)

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

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

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

完成此操作后,请定义包含PDF文件的目录的路径$pdf_path

然后您可以转到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";

}

答案 1 :(得分:-1)

这里的问题是,您标识资源的方式可以通过更改URL进行枚举。甚至大型公司也已陷入这些“骇客”,因此很高兴您知道此问题并希望避免。

有两种处理方法。

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

无论哪种情况,都需要根据您的方案而不是用户ID来命名文件。