- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 Web 应用程序中,我想为每个 www-data
用户创建一个文件夹,并仅向该用户授予对该文件夹的写入权限。
验证后我可以:
mkdir($file->getPath().mt_rand(0,100000),0700);
这将在路径 $file->getPath()
中创建一个具有随机名称的新目录,拥有所有者用户的所有权限。但它会将权限授予所有 www-data
用户。
如果我创建一个 chroot jail,我必须为每个用户再次复制所有文件,因为我应该创建很多 jail(一个给用户)。
我对此很着迷,但没有找到解决方案。
最佳答案
如果我理解你的问题是对的,那么你的问题始于 linux 权限/用户框架的结构。因此,拥有 Apache 进程的用户是在运行脚本时创建目录和文件的用户。
如果您需要脚本的用户分离,例如:您的服务器上的不同(虚拟)主机有不同的目录,并且您不希望一个主机的脚本作用于同一台(apache)上不同主机的数据) 服务器,那么你应该使用 'mpm_itk_module' 而不是更常见的 'mpm-prefork' apache。
使用它,您可以定义 apache 在执行任何脚本时使用的用户/组,例如仅通过此命令为 httpd.conf 中的每个虚拟主机条目创建目录:
<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>
如果你真的想从一个脚本执行中创建不同的目录,你需要 apache 进程由 root.root 拥有,然后脚本需要按照你想要的方式为每个目录设置权限和所有者。
但以 root 身份在网络服务器上运行即使是最好的脚本也绝不是一个好主意,因为您可能没有想到任何风险。
在我看来,虚拟主机的用户/权限分离似乎是一种更节省的方式。
另一点 - 仅限 PHP - 是 suPHP -> http://www.suphp.org
编辑:
好的,我查看了您的网站,即使我不会说西类牙语,看起来您只有一个网站,为始终访问该网页的不同用户提供服务。那么linux文件系统权限哪里需要用户分离呢?您可以通过应用程序限制所有内容,而无需文件系统用户。即使你给例如额外的 ftp 访问 - 限制它,例如对于 proftpd,它具有针对不同用户的自己的 chroot 机制。
只有当您无法控制谁在执行什么时,您才应该关心文件系统权限。这是多域主机上的一个常见问题,您可以使用我提到的 mpm_itk_module 来解决。
也许你应该多描述一下你的情况?
编辑 2:
正如评论中所建议的,如果您只使用 apache 来让用户访问文件以进行上传/操作,那么只需将文件放在(!)apache 的 documentroot 树之外,并创建简单的数据库来了解哪个文件是由哪个用户拥有:
user a | file parentdir/filename
这可能是一个简单的表格,您的 php 代码从数据库中向用户提供了一个列表,用户可以查看/操作哪个文件,并且您的代码按照用户操作的预期进行工作。
只要您不授予用户通过其他服务(ftp、ssh 等)访问文件的权限,就根本不需要使用 linux 用户权限。只需注意将文件放在服务器的 documentroot 之外,这样只有您的 php 代码才能通过服务器的 apache 用户权限访问这些文件。
编辑 3:
哈哈,在我读了你的类似帖子后,现在终于明白你的问题了:( How can an Apache user write files when having permissions to do it? )在这种情况下(在您的网页上有真正的匿名用户)您根本没有机会解决这个问题。每个访客都被视为同一访客,无需身份验证。正如我在上次编辑中假设的那样,并在类似的帖子中评论道:根本不需要处理 linux 文件权限。
您的解决方案 ;) :当用户访问您的页面时,您需要在一个 session 中使用 session ID 进行文件操作。因此,您的代码需要处理访问者( session ID)和他使用此 session ID 上传的文件之间的关系。使用只要访问者在线就有效的 session ID 是执行此操作的最佳方法。再一次 - 不需要文件系统权限.... ;)
第二种方法是按照之前的建议使用授权用户:创建一个包含用户/密码的数据库表来登录网页(而不是服务器)和另一个保存用户/文件关系的表。然后,在他登录网页后,再次使用 session 来允许用户访问/操作已经上传的文件。
关于php - 区分每个apache用户并赋予权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529639/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
Android 权限(您在 list 中请求并在安装时显示的权限)是否与 root 用户在 root 手机上获得的 linux 权限相同? 更确切地说:如果我的手机上有 root 权限并且我有一个可以
我经常读到 VIEW 的一个目的是安全性:允许一些用户访问基础表,而其他用户只允许访问派生 View 。考虑到这一点,我设计了几个向外部用户提供受限数据集的 View 。 一切都很好,但在实践中这是行
在 Facebook API v2.3 中,“user_posts”听起来像是“user_status”的超集。是这样吗?如果我已经有“user_posts”,为什么还需要“user_status”?
在为 BLUETOOTH_CONNECT 请求运行时权限后,android 12 崩溃了,我在 Samsung Android 12 设备中遇到了这个问题。在其他低于 Android 12 的设备上运
请理解这个问题可能有点头晕,因为这是我第一次提问。另外,请理解语法可能很奇怪,因为我不擅长英语并使用翻译。 我是一个在 Android 工作室中使用 java 制作应用程序的人。 尝试使用蓝牙时出现连
我刚刚将我的 Magento 商店从 cPanel 移动到 DirectAdmin (Centos)。 我的问题现在是权限。以前在 cPanel 上,所有文件夹都设置为 755 和文件 644。这很好
我希望在我的 Django 项目中获得更细粒度的权限,但无法决定使用哪个应用程序。 我所拥有的是这样的: class Item(models.Model): name = models.Cha
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我们已经设置了一个 Github 应用程序,以便它使用 Github API 自动为另一个个人 Github 用户创建一个存储库。现在我们遇到了一个问题,不是每个人都想让我们完全读取他们所有的私有(p
假设我有一个网站想要访问 Facebook 的用户帐户信息。通常,用户会获得网站要求的所有权限,并且可以整体上允许或拒绝这些权限。 是否可以让用户选择(例如,通过授权屏幕上每个权限的复选框)他想授予网
平台下载地址:https://gitee.com/alwaysinsist/edp 权限介绍 权限实际上就是谁有权使用或是访问什么,这里的“谁”可以视作"授权对象",&qu
playstore 给我发这个消息 We've detected that your app contains the requestLegacyExternalStorage flag in the
我可以在没有 sudo 的情况下运行 docker,但有时它会再次请求权限,我无法在 VS 代码中附加容器 Got permission denied while trying to connect
我正在尝试在 Ubuntu 中的可执行文件上运行 gdb。但是,当我尝试在 gdb 中运行 run 时,出现以下错误。 /vagrant/unit_test: cannot execute: Perm
我的应用程序工作了一年,然后对 instagram 的 API 调用停止返回任何数据。 我使用以下 instagram 端点: https://api.instagram.com/v1/media/s
我使用 TFS 2012 并希望为 TFS 用户组设置以下权限。 允许创建新问题项。 拒绝创建新的任务项。 拒绝更改他的任务项,只能更改提醒时间、描述和状态。并且不能更改分配的用户、优先级和迭代。 我
我有一个谷歌计算引擎实例,我使用与我的 glcoud 帐户关联的 SSH key 通过 SFTP 连接到该实例。但是,我无法将任何文件上传到/var/www 目录,尽管我可以读取目录列表。/var/w
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我不确定如何正确处理以下情况: 我的程序通过安装程序安装 我在应用程序文件夹中创建SQLite数据库(程序启动时) 在某些配置中,我收到“ Attemt写入只读数据库”错误。这是权限问题,现在我通过将
我是一名优秀的程序员,十分优秀!