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

bjp0bcyl  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(350)

嗨想在我的网站上为每个用户放置1个pdf文件。该文件具有user id.pdf,由phc生成。这是大约1500 pdf和他们是开放的每个用户的id。问题是,如果其他用户更改链接到其他名称可以看到其他pdf文件,他只需要采取正确的id号码。
如何限制访问?

l3zydbqr

l3zydbqr1#

这里的问题是,您标识资源的方式可以通过更改url来枚举它们。即使是大公司也陷入了这些“黑客攻击”中,所以你意识到这个问题并想避免它是件好事。
有两种方法可以解决这个问题。
确保每个资源都有一个随机标识符,即它没有以任何方式链接到用户id。一个uuid、12个或更多字母的随机字符串或20个数字的随机数就足够了。这些文件需要提前生成并存储在数据库中,否则您将无法知道谁拥有哪个文件。
基于用户id加上其他一些秘密因素(如密钥),使用确定性散列来生成标识符,如sha2-256,这样它们就不会被猜测。 6B86B273FF3...B7875B4B 可能看起来是随机的,但它只是“1”的sha2-256散列,攻击者会知道这一点。确定性散列的优点是你可以随意计算,你不需要把它保存在任何地方。您可能不需要整个散列,50-70%的长度肯定是唯一的,因为与此冲突在数学上几乎是不可能的。
在这两种情况下,您都需要根据您的方案命名文件,而不是按用户id命名。

4urapxun

4urapxun2#

像这样的事情应该会有帮助:
我已经定义了 $current_user 作为 123 . 显然,要更改此代码,以便根据当前处理身份验证的方式准确设置此变量的值。
下一步是将所有pdf文件移到不可通过web访问的目录中。这意味着只需在地址栏中键入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";

}

相关问题