嗨想在我的网站上为每个用户放置1个pdf文件。该文件具有user id.pdf,由phc生成。这是大约1500 pdf和他们是开放的每个用户的id。问题是,如果其他用户更改链接到其他名称可以看到其他pdf文件,他只需要采取正确的id号码。如何限制访问?
l3zydbqr1#
这里的问题是,您标识资源的方式可以通过更改url来枚举它们。即使是大公司也陷入了这些“黑客攻击”中,所以你意识到这个问题并想避免它是件好事。有两种方法可以解决这个问题。确保每个资源都有一个随机标识符,即它没有以任何方式链接到用户id。一个uuid、12个或更多字母的随机字符串或20个数字的随机数就足够了。这些文件需要提前生成并存储在数据库中,否则您将无法知道谁拥有哪个文件。基于用户id加上其他一些秘密因素(如密钥),使用确定性散列来生成标识符,如sha2-256,这样它们就不会被猜测。 6B86B273FF3...B7875B4B 可能看起来是随机的,但它只是“1”的sha2-256散列,攻击者会知道这一点。确定性散列的优点是你可以随意计算,你不需要把它保存在任何地方。您可能不需要整个散列,50-70%的长度肯定是唯一的,因为与此冲突在数学上几乎是不可能的。在这两种情况下,您都需要根据您的方案命名文件,而不是按用户id命名。
6B86B273FF3...B7875B4B
4urapxun2#
像这样的事情应该会有帮助:我已经定义了 $current_user 作为 123 . 显然,要更改此代码,以便根据当前处理身份验证的方式准确设置此变量的值。下一步是将所有pdf文件移到不可通过web访问的目录中。这意味着只需在地址栏中键入url就不可能访问pdf。完成后,定义路径, $pdf_path 到包含pdf文件的目录。然后你可以去 script.php?user=123 . 如果 user 比赛 $current_user 然后php代码将获取适当的pdf文件,然后将其输出给用户。如果尝试指定不同的值 user 当您登录时,您将看到错误消息。祝你好运。。
$current_user
123
$pdf_path
script.php?user=123
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"; }
2条答案
按热度按时间l3zydbqr1#
这里的问题是,您标识资源的方式可以通过更改url来枚举它们。即使是大公司也陷入了这些“黑客攻击”中,所以你意识到这个问题并想避免它是件好事。
有两种方法可以解决这个问题。
确保每个资源都有一个随机标识符,即它没有以任何方式链接到用户id。一个uuid、12个或更多字母的随机字符串或20个数字的随机数就足够了。这些文件需要提前生成并存储在数据库中,否则您将无法知道谁拥有哪个文件。
基于用户id加上其他一些秘密因素(如密钥),使用确定性散列来生成标识符,如sha2-256,这样它们就不会被猜测。
6B86B273FF3...B7875B4B
可能看起来是随机的,但它只是“1”的sha2-256散列,攻击者会知道这一点。确定性散列的优点是你可以随意计算,你不需要把它保存在任何地方。您可能不需要整个散列,50-70%的长度肯定是唯一的,因为与此冲突在数学上几乎是不可能的。在这两种情况下,您都需要根据您的方案命名文件,而不是按用户id命名。
4urapxun2#
像这样的事情应该会有帮助:
我已经定义了
$current_user
作为123
. 显然,要更改此代码,以便根据当前处理身份验证的方式准确设置此变量的值。下一步是将所有pdf文件移到不可通过web访问的目录中。这意味着只需在地址栏中键入url就不可能访问pdf。
完成后,定义路径,
$pdf_path
到包含pdf文件的目录。然后你可以去
script.php?user=123
. 如果user
比赛$current_user
然后php代码将获取适当的pdf文件,然后将其输出给用户。如果尝试指定不同的值user
当您登录时,您将看到错误消息。祝你好运。。