我正在尝试了解如何在我的服务器上设置文件权限。我阅读了很棒的指南https://serverfault.com/questions/357108/what-permissions-should-my-website-files-folders-have-on-a-linux-webserver。
1. 我网站的访客
该指南指出
匿名用户是您网站的访问者。尽管他们没有直接访问文件的权限,但他们可以请求网页,并且 Web 服务器会代表他们行事。您可以通过注意 Web 服务器进程的权限来限制匿名用户的访问。在许多 Linux 发行版中,Apache 以 www-data 用户身份运行,但情况可能有所不同。使用 ps aux | grep httpd 或 ps aux | grep apache 查看 Apache 在您的系统上使用的用户。
我在笔记本电脑上使用 XAMPP。如果我输入,ps aux | grep httpd
我会得到
adam 6635 0.0 0.0 21292 960 pts/1 S+ 15:51 0:00 grep --color=auto apache
因此 Apache 以 的身份运行adam
。此外,我还有一个名为的文件,test2.php
具有以下权限:
-r-------- 1 adam adam 24 Dez 31 15:20 test2.php
因此只有文件的所有者才能读取它。但由于 Apache 是所有者,我预计如果我在浏览器中请求该文件,我应该能够读取它。
但是,我收到以下错误
警告:未知:无法打开流:第 0 行未知中的权限被拒绝
致命错误:未知:无法打开所需的‘/home/adam/www/site/test2.php’(include_path=‘.:/opt/lampp/lib/php’)在第 0 行的未知位置
但上面的引文不是说我应该能够访问它吗?因为
他们可以请求网页,然后网络服务器代表他们采取行动。
2. PHP 文件
考虑一个包含以下内容的 php 文件
<?php
$string = fopen("stuff.txt","r");
php 文件stuff.txt
是否仅当stuff.txt
权限类可读时才可以打开other
?或者,如果 Apache 是文件的所有者并具有读取权限,但权限类other
没有读取权限,它是否也可以读取?
答案1
PHP 可能以不同的操作模式运行,如果 PHP 编译为 Apache 的模块(XAMPP 就是这种情况),那么 Apache 可以看到的所有内容都可用于 PHP,并且由于 PHP 是解释器语言,它可以运行它可以看到的内容(如果它包含<?php ... ?>
任何类型的文件)。如果您将 PHP 作为独立监听服务运行(使用 php-fpm),那么您可以将 Apache 与 PHP 分开。在这种情况下,Apache 将只是 PHP 的转发代理。这样,您可以在不同的用户帐户下运行 Apache 和 PHP。
请记住,即使您在 root/administrator 下安装 XAMPP,在将监听端口绑定到 apache 配置中指定的用户帐户后,它也会放弃特权权限。
为了能够在端口 80(特权端口)上运行 Web 服务器,Apache 需要 root/管理员权限才能启动,但启动后它将以普通(最好是受限)用户身份运行
XAMPP/LAMPP 通常不用于生产,因为它默认具有非常宽松的设置并且主要用于开发阶段。
如果您想要生产安全模型,那么请分离每个服务的所有角色,并在不同的、受限制的(非管理)帐户下运行每个服务(Apache、PHP、MySQL)。
一个好的安全模型是,除了真正需要可写的文件或目录之外,暴露在互联网上的所有内容(Apache 可访问的)都应该具有只读权限,但在这种情况下,您需要限制 Apache 中的这些资源,根据使用情况,可以通过禁用访问或关闭此类目录中的 PHP 引擎来限制。
回到你的问题:你写道你使用 XAMPP,这意味着你在 Windows 下运行它。右键单击任务栏并运行任务管理器以查看 apache 进程的名称和正在运行的用户帐户,以确定 PHP 具有哪些权限。
但我猜你运行的是 LAMPP,而不是 XAMPP,因为你的 Web 目录看起来像基于 Unix 的环境“/home/adam/www/site/test2.php”。它与 Windows 非常不同。根据你使用的操作系统,Apache 服务可能以不同的名称而不是 httpd 运行,它可能是 apache2(在 Debian 上),因此当你试图发现正在运行的进程时,请在 中使用正确的名称grep
。(为了简化你的生活,htop
在基于 Unix 的系统上安装以发现进程的活动)
如果我对你的使用 LAMPP 的判断是正确的,请检查 web 目录权限及其子目录,这些子目录均由与运行 apache 的用户相同的用户拥有。如果你需要某些文件的文件库保护,请将所有权转让给与为 web 服务分配的用户不同的用户。