Unix 权限,读取与执行(PHP 上下文)

2022-08-31 00:58:20

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

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

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

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


答案 1

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


答案 2

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

如果您尝试使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服务器)执行任何有用的操作;-)


推荐