【问题标题】:How to limit permissions that a php script has for reading/writing to files [windows/apache]?如何限制 php 脚本读取/写入文件 [windows/apache] 的权限?
【发布时间】:2016-10-11 14:04:57
【问题描述】:

(这里是php/apache初学者)

简介

通过 PHP 使用 Apache(作为 Windows 上的服务)我已经意识到,虽然默认情况下网络用户只能访问 \htdocs 内容,但 PHP 脚本本身可以在任何地方读取(不限于\htdocs)。如果我们不确定 PHP 脚本的内容并希望限制文件系统访问会发生什么?

问题

假设我们希望允许人们更改 .php 文件的内容,但同时应用文件系统级别限制。例如:script1.php 可以读/写/执行任何东西 c:\apache\htdocs。它可以从 c:\f1\ 只读但可以完全访问任何其他目录

问题

如何确保他/她的 PHP 程序在 Windows 中读取或写入时具有非常特定的权限(例如,file_exists()mkdir()proc_open()fwrite()、GD:imagejpg())在\htdocs之外?

其他想法

我了解到 apache 作为服务以 LocalSystem 帐户运行在大多数本地路径上具有完全读写 (777) 权限。 1

  • 如果我创建一个新的(虚拟?)用户帐户,将其分配给 apache 服务并根据我的喜好更改该特定帐户的 [rwx] 权限,是否正确?
  • 有没有办法为不同的 PHP 脚本创建不同的组限制? 例如。除了c:\apache\htdocsscript1.php 也可以在c:\f1 中读写,而script2.php 可以在c:\f2 中只读
  • 此外,是否可以创建一个“权限管理器”——一个 PHP 脚本,在执行时将权限分配给其他 php 脚本? 例如所有小于 120 字节的 .php 脚本都可以读写 c:\f1

感谢您的宝贵时间,

-福蒂斯

【问题讨论】:

  • 如果您使用的是过时/旧版本的 php,则可以使用 php safe mod。并且有多种监禁脚本的方法,例如chroot。但是如果您不确定 php 代码,为什么首先允许它靠近您的服务器?最好的安全措施就是不允许任何可疑代码靠近您的系统。
  • 谢谢@Marc B! chroot/safe_mode 上的精彩阅读 - 幸运的是,我不是为他人提供服务的 shared-host,所以我不打算在我的系统中允许可疑的 PHP 代码。我对沙盒可以达到的水平更好奇:我对自己对保护 Apache/PHP 的理解不是很有信心,因此担心可能存在的安全漏洞。我认为实施外部限制(即在文件系统上)将包含任何损害的性质和程度。另外,错误的代码也会造成很大的破坏(删除、覆盖错误目录上的文件);-)

标签: php windows apache permissions user-accounts


【解决方案1】:

在您的 Apache 设置中,httpd.conf,应该有这样的内容:

#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User www-data
Group www-data

这将是 Apache 运行您网站的用户和组。您只需限制该用户对您不希望他们访问的文件的权限。

【讨论】:

  • 谢谢@Chin Leung!很高兴知道这存在 - 不确定这种方法是否适用于 Windows?另外,在我的httpd.conf 中,User/Group 都设置为daemon
  • 是的@FotisK 这也适用于 Windows。由于用户和组都设置为daemon,apache 以用户和组daemon 运行网站。您可以在此处阅读有关 Windows 权限的更多信息:eightforums.com/tutorials/…
  • 谢谢@Chin Leung!不幸的是,我没有设法让它工作 - 在httpd.conf 我将 UserGroup 分别更改为 testusertestgroup(为了清楚起见)并创建一个没有密码的testuser,并将他分配给testgroup。我选择了我的脚本需要 运行的文件夹,并确保用户被拒绝 每个权限(读取和执行、列出内容、修改等)。仍然运行 PHP 脚本绕过了所有限制。作为说明,我在我的 apache 模块 1 中找不到 mod_unixd.so
  • 如果我以其他方式转到Services.mscApache2.4PropertiesLog On 而不是LocalSystem 选择testuser,则正确应用限制。但我不确定这种方法有多合适(更不用说我可能希望为不同的 PHP 脚本设置不同的限制集 - 不是一个适用于所有脚本)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
相关资源
最近更新 更多