Man*_*olo 7 php linux apache permissions chroot
在Web应用程序中,我想为每个www-data
用户创建一个文件夹,并仅在该文件夹上提供写入权限,并且只为该用户提供写入权限.
验证后,我可以这样做:
mkdir($file->getPath().mt_rand(0,100000),0700);
Run Code Online (Sandbox Code Playgroud)
这将在$file->getPath()
具有所有者用户的所有权限的路径中创建具有随机名称的新目录.但它会为所有 www-data
用户授予权限.
如果我创建一个chroot jail,我必须为每个用户再次复制所有文件,因为我应该创建许多jails(一个用于用户).
我对此感到疯狂,并没有找到解决方案.
如果我理解你的问题是正确的,你的问题始于linux权限/用户框架的结构。因此,拥有用户的 Apache 进程是在运行脚本时创建目录和文件的用户。
如果您需要脚本的用户分离,例如:您的服务器上的不同(虚拟)主机有不同的目录,并且您不希望一台主机的脚本作用于同一(apache)服务器上不同主机的数据,那么你应该使用“mpm_itk_module”而不是更常见的“mpm-prefork”apache。
使用它,您可以定义 apache 在执行任何脚本时使用的用户/组,例如,仅通过此命令为 httpd.conf 中的每个虚拟主机条目创建目录:
<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>
Run Code Online (Sandbox Code Playgroud)
如果您确实想通过一个脚本执行创建不同的目录,则需要 root.root 拥有 apache 进程,然后脚本需要按照您想要的方式为每个目录设置权限和所有者。
但以 root 身份在网络服务器上运行即使是最好的脚本也绝不是一个好主意,因为您可能不会想到任何风险。
在我看来,通过虚拟主机进行用户/权限分离似乎是一种更节省的方式。
另一点 - 仅 PHP - 是 suPHP -> http://www.suphp.org
编辑:
好的,我浏览了您的网站,即使我不会说西班牙语,看起来您只有一个网站,代表始终通过该网页访问的不同用户。那么linux文件系统权限上哪里需要用户分离呢?您可以通过应用程序限制一切,无需文件系统用户。即使您提供额外的 ftp 访问权限 - 例如使用 proftpd 对其进行限制,它对于不同的用户都有自己的 chroot 机制。
仅当您无法控制谁在执行什么时,您才应该关心文件系统权限。这是多域主机上的常见问题,您可以使用我提到的 mpm_itk_module 来解决。
也许你应该多描述一下你的情况?
编辑2:
正如评论中所建议的,如果您仅使用 apache 来让用户访问文件以进行上传/操作,那么只需将文件放在 apache 的文档根树之外(!)并创建简单的数据库以了解哪个文件属于哪个文件用户:
user a | file parentdir/filename
Run Code Online (Sandbox Code Playgroud)
这可能是一个简单的表格,您的 php 代码从数据库中向用户提供一个列表,用户可以查看/操作该文件,并且您的代码按照用户操作的预期完成工作。
只要您不授予用户通过其他服务(ftp、ssh 等)访问文件的权限,就根本不需要使用 Linux 用户权限。只需注意将文件放置在服务器的 documentroot 之外,以便只有您的 php 代码才能通过服务器的 apache 用户的权限访问这些文件。
编辑3:
哈哈,现在我终于在读了你的类似帖子后遇到了你的问题:(Apache 用户在有权限的情况下如何写入文件?)在这种情况下(在你的网页上有真正的匿名用户)你没有机会根本解决这个问题。每一位访客都会被视为同一访客,无需进行身份验证。正如我在上次编辑中所假设的并在类似帖子中评论的那样:根本不需要处理 Linux 文件权限。
您的解决方案;):当用户访问您的页面时,您需要在一个会话中使用会话 ID 进行文件操作。因此,您的代码需要处理访问者(会话 ID)和他使用该会话 ID 上传的文件之间的关系。使用只要访问者在线就有效的会话 ID 是实现此目的的最佳方法。再说一次 - 不需要文件系统权限......;)
第二种方法是使用之前建议的经过身份验证的用户:创建一个数据库表,其中包含用于登录网页(而不是服务器)的用户/密码,以及另一个保存用户/文件关系的表。然后,在他登录网页后,再次使用会话以允许用户访问/操作已上传的文件。
归档时间: |
|
查看次数: |
505 次 |
最近记录: |