【问题标题】:Unix permissions, read vs. execute (PHP context)Unix 权限,读取与执行(PHP 上下文)
【发布时间】:2011-01-01 21:49:45
【问题描述】:

我有一个需要连接到数据库的 php 脚本。数据库的凭据存储在另一个 php 脚本中。

如果我将凭据文件的权限设置为 661,以便 Public 具有执行权限但没有读取权限,这是否允许主脚本访问凭据并连接到数据库,同时防止有人在服务器上拥有用户帐户从查看凭证文件的内容?

我想我对读取和执行之间的区别感到困惑。 php 脚本(以 www 或类似的方式运行)是否需要读取权限才能包含另一个 php 脚本并使用其中的任何内容?还是只需要执行?读取权限是否隐式赋予执行权限?

子问题:如果我将所有脚本都设置为只有执行权限而不是读取,我应该预料到有什么陷阱吗?这是假设我将保留任何需要明确读取权限的文件(数据文件)设置为读取。

【问题讨论】:

  • 我最近阅读了有关 setuid 和 setgid 位的信息。是否可以在 php 解释器上使用 setuid 并为 php 解释器和 php 文件提供自己的 uid,并设置脚本属性仅授予用户读取权限?那么读取 php 文件的唯一方法就是以 php 用户身份登录,或者由任何人通过解释器登录。
  • 我太慢了,无法编辑我之前的评论:setuid 很危险。如果您将 php 保留为 root 用户,一个漏洞将是在您自己的脚本之一上运行 php,并且它将对您的系统具有 root 访问权限,(据我了解。)

标签: php unix permissions include


【解决方案1】:

就文件而言,执行权限与您无关 - 运行您的 Web 服务器的用户帐户需要访问和读取相关文件的权限。为了遍历目录,用户还需要对该目录的执行权限。

如果您试图使您的脚本可以被网络服务器读取(假设您以属于“www”组的帐户“www”运行),而不是系统上的其他用户,这就是我会做(假设您的帐户是“myuser”):

# Change owner to "myuser" and group to "www" for file(s) in question
chown myuser:www config.php

# 640: myuser has rw-, www has r--, world has ---
chmod 640 config.php

如果你想阻止世界读取“secrets”目录中的任何文件,只需禁用执行位:

# 750: myuser has rwx, www has r-x, world has ---
chmod 750 secrets

如果您将所有脚本都设置为具有执行权限但没有读取权限,那么没有人可以对它们做任何有用的事情(包括网络服务器);-)

【讨论】:

  • 请注意,如果其他用户有权通过 Web 服务器运行他们自己的 PHP 代码,那么这不会阻止他们。在这种情况下,可以查看 open_basedir 或允许您以不同用户身份运行不同虚拟主机/应用程序的解决方案。
  • 是的,经过仔细检查,我发现 www 是我困惑的目录的组成员。我不是想破解它,我只是想模仿他们所做的,但不只是镜像它。
【解决方案2】:

脚本被读取,而不是被执行。脚本的执行权限告诉加载器或内核读取 shebang 行并将脚本传递给指定的解释器。

【讨论】:

  • 因此,如果我在名为“secrets”的文件夹中有一个脚本并且将机密设置为仅执行,那么曾经对机密具有读取权限(但现在没有)的人可以插入文件直接命名为 nano 并仍然看到内容?我想这是我真正关心的问题。
  • 如果“secrets”是一个脚本,那么如果运行解释器的用户没有对该脚本的读取权限,它就无法运行。它过去拥有的任何权限都无关紧要;唯一重要的权限是文件打开时,无论是读取还是运行。
猜你喜欢
  • 2014-06-17
  • 2014-05-09
  • 2021-09-28
  • 1970-01-01
  • 2014-12-14
  • 2011-01-16
  • 2021-09-06
  • 2014-01-18
相关资源
最近更新 更多