【发布时间】:2018-08-27 15:40:44
【问题描述】:
您好希望在我的网站上为每个用户放置 1 个 PDF 文件。该文件具有用户 ID.pdf 并由 phc 生成。它大约有 1500 个 PDF,每个用户都通过 ID 打开它们。问题是如果其他用户将链接更改为其他名称可以看到其他 PDF 文件,他只需要使用正确的 ID 号。
如何限制访问?
【问题讨论】:
您好希望在我的网站上为每个用户放置 1 个 PDF 文件。该文件具有用户 ID.pdf 并由 phc 生成。它大约有 1500 个 PDF,每个用户都通过 ID 打开它们。问题是如果其他用户将链接更改为其他名称可以看到其他 PDF 文件,他只需要使用正确的 ID 号。
如何限制访问?
【问题讨论】:
这样的事情应该会有所帮助:
我已将$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 之类的东西或危险的东西。
这里的问题是,您正在以一种可以通过更改 URL 来枚举它们的方式来识别资源。即使是大公司也陷入了这些“黑客行为”,因此您最好意识到这个问题并希望避免它。
有两种方法可以解决这个问题。
6B86B273FF3...B7875B4B 可能看起来是随机的,但它只是“1”的 SHA2-256 哈希值,攻击者会知道这一点。确定性哈希的优点是您可以随意计算它,您无需将其保存在任何地方。您可能不需要整个哈希,50-70% 的长度肯定足够独特,因为与此的冲突被设计为在数学上几乎是不可能的。在任何一种情况下,您都需要根据您的方案命名文件,而不是按用户 ID。
【讨论】: