Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 阻止特定用户的目录列表和文件_Php_.htaccess_Permissions_File Access - Fatal编程技术网

Php 阻止特定用户的目录列表和文件

Php 阻止特定用户的目录列表和文件,php,.htaccess,permissions,file-access,Php,.htaccess,Permissions,File Access,我有一个文件夹(/files),那里有大量的文件供用户下载。我希望用户只能下载他们的文件,而不能看到其他人的文件 例如: 用户A只能查看和下载: - file1.doc - file2.jpg 用户B只能查看和下载: - file3.txt - file4.jpeg - file1.doc - file2.jpg - file3.txt 用户C只能查看和下载: - file3.txt - file4.jpeg - file1.doc - file2.jpg - file3.txt 我的

我有一个文件夹(/files),那里有大量的文件供用户下载。我希望用户只能下载他们的文件,而不能看到其他人的文件

例如:

用户A只能查看和下载:

- file1.doc
- file2.jpg
用户B只能查看和下载:

- file3.txt
- file4.jpeg
- file1.doc
- file2.jpg
- file3.txt
用户C只能查看和下载:

- file3.txt
- file4.jpeg
- file1.doc
- file2.jpg
- file3.txt
我的想法是把所有文件放在同一个文件夹中,这样所有用户都知道去哪里。我的问题是:我可以使用.htaccess吗?还是应该为此构建一个PHP脚本?安全性如何(哪个更安全)


谢谢

构建一个PHP脚本,用于将文件发送到浏览器。通过这种方式,您可以限制对单个文件的访问,并使用现有的身份验证系统。

构建一个PHP脚本,用于将文件发送到浏览器。通过这种方式,您可以限制对单个文件的访问,并使用现有的身份验证系统。

首先,它是一个开放目录吗?您可以为每个用户创建一个子文件夹,将他们的文件放在其中,然后在.htaccess中为这些文件夹分配适当的权限。但是,这需要与您的操作系统进行一些安全集成(即,用户必须在您的计算机上拥有帐户,而不仅仅是您的web应用程序)。。。一种快速、肮脏且不安全的替代方法是在所有上传的文件名前加上用户名(例如,“foobar”上传的“file1.jpg”可以命名为“foobar.file1.jpg”),然后PHP脚本只返回带有相应用户名的文件,可能在显示时去掉该部分(或者,您也可以使用文件夹,只要您的脚本可以在不存在文件夹的情况下为每个用户创建一个新文件夹即可)。另一种更安全的方法是在数据库中创建文件和用户名的散列,使用此散列重命名所有上载的文件,然后适当地查询数据库


最好的解决方案肯定是操作系统管理的帐户,这是我首先提到的,但它需要更多的开销。

首先它是一个开放目录吗?您可以为每个用户创建一个子文件夹,将他们的文件放在其中,然后在.htaccess中为这些文件夹分配适当的权限。但是,这需要一些安全性与您的操作系统集成(即,用户必须在您的计算机上拥有帐户,而不仅仅是您的web应用程序)…一个快速、肮脏且不安全的替代方法是在所有上传的文件名前加上用户名(例如,“foobar”上传的“file1.jpg”可以命名为“foobar.file1.jpg”),则PHP脚本只返回具有相应用户名的文件,并可能在显示时删除该部分(或者,您也可以使用文件夹,只要您的脚本可以为每个用户创建一个新文件夹,而不存在该文件夹)。另一个更安全的选项是在数据库中创建文件和用户名的哈希,使用此哈希重命名所有上载的文件,然后适当地查询数据库


最好的解决方案肯定是操作系统管理的帐户,这是我第一次提到的,但它会带来更多的开销。

您当然可以使用htaccess或PHP来实现这一点。据我所知,两者都不是更安全的,因为另一种方法虽然做得不对,但都可以允许在不需要访问的地方进行访问


PHP可能会稍微好一点,因为您有更多的灵活性(例如,在将它与其他PHP身份验证集成方面)您可以将文件夹放在通常的web根目录之外,这是一种很好的做法。

您当然可以使用htaccess或PHP进行此操作。据我所知,这两种方法都不更安全,即另一种方法虽然都做得不对,但都可以允许在不需要访问的地方进行访问


PHP可能会稍微好一点,因为您有更多的灵活性(例如,在将它与其他PHP身份验证集成方面)您可以将文件夹放在通常的web根目录之外,这是一种很好的做法。

您可以详细说明文件的哈希吗?当用户上载文件时,您的脚本可以使用一些唯一的密钥重命名文件。例如,您可以使用用户名和文件名的SHA1哈希,再加上一些盐(例如,上载时间);因此,如果
foo
201109291510
上上载
bar.jpg
,则可以将该文件重命名为
SHA1('foo bar.jpg 201109291510')
并在数据库中存储此密钥,用户名和原始文件名为明文……然后,当向用户显示文件列表时,您可以查询数据库
其中user='foo'
,在屏幕上显示明文文件名,但链接到哈希文件名(这对于任何人来说都很难强制执行)。不用说,salt越不确定,攻击者就越难定位特定文件。请注意,虽然不太可能,但您的代码还应检查SHA1(或其他)情况下的冲突在不同的情况下生成相同的哈希。您能详细说明文件的哈希吗?当用户上载文件时,您的脚本可以使用某个唯一密钥重命名文件。例如,您可以使用用户名和文件名的SHA1哈希,再加上一些salt(例如,上载时间);因此,如果
foo
201109291510
上上载
bar.jpg
,则可以将该文件重命名为
SHA1('foo bar.jpg 201109291510')
并在数据库中存储此密钥,用户名和原始文件名为明文……然后,当向用户显示文件列表时,您可以查询数据库
其中user='foo'
,在屏幕上显示明文文件名,但链接到哈希文件名(这对于任何人来说都很难强制执行)毫无疑问,salt越不确定,攻击者就越难找到特定文件。请注意,虽然不太可能,但您的代码也应该检查冲突,以防