我正在阅读一本关于PHP安全性的书,下面我不太明白,具体部分用粗体显示。 所以说PHP想要移动属于用户A的文件,PHP必须以用户A运行? 这是允许的吗? 我不是一个真正的系统pipe理员,但我真的不明白这是如何使服务器或多或less的安全
SUID或“设置用户ID”位是UNIX和Linux文件系统权限function,使您可以指定相关应用程序始终以拥有二进制文件的用户身份运行 –无论哪个用户启动该进程
我假设我们正在谈论一个Web服务器。 通常,当Web服务器运行PHP库(或可执行文件)时,PHP将作为Web服务器的用户运行。 因此,如果Web服务器以用户“www”运行,那么PHP将以该用户身份运行,并将inheritance该用户的权限。
如果你设置了SUID位,那么PHP将不会以“www”用户的身份运行,相反,PHP程序的所有者就是PHP程序将运行的那个人。 因此,如果“root”拥有PHP,那么PHP将始终以“root”身份运行,并拥有所有相关的权限。 这可能是非常危险的,因为在Unix系统上,“根”具有无限的能力(pipe理员帐户仅次于Windows系统帐户,并且能够造成非常接近的损失,足够糟糕)。
现在,如果您希望PHP能够以用户'joe'打开文件,那么PHP必须以用户'joe'的身份运行。 如果这是来自Web服务器,这只能以两种方式之一(通常)发生。 1. Web服务器以“joe”运行,PHP将inheritance这些权限。 2. PHP作为可以承担其他用户权利的用户运行(通常这种能力被保留为“root”)。
由于以“joe”运行Web服务器是不现实的,所以SUID PHP程序通常以root身份运行,然后承担用户“joe”的权限。 这可能是非常危险的,因为程序中的错误很容易让任何人闯入服务器并造成无数的损害。 此外,Web服务器的其他部分的错误可能会利用这一点,并再次造成损害。 出于这个原因(和其他人),非常鼓励你不SUID(除非绝对必要)并编写不需要的程序。
根据您的确切环境,可能会应用更多详细信息,其中一些可能不准确。 我尽我所能,不知道你在做什么。 另外请注意,在Windows中没有SUID,但在运行Web服务器时可以使用该function。