首先,让我们从主目录的基本树结构开始(对于基于 cPanel 的基本设置):
└── /
├── etc
├── mail
├── public_ftp
├── public_html
│ ├── css
│ ├── images
│ ├── javascript
│ └── upload
└── tmp
在您的情况下,这棵树可能略有不同,但或多或少是相同的。
您的Web 根目录是您的 HTTP 服务器(无论是 Apache、Nginx、Lighttpd 还是其他一些软件)指向您当前域的位置。在典型的 cPanel 设置中,这是public_html
目录。因此,如果您的帐户被配置为使用该域example.com
,那么对该域的所有访问都将直接指向public_html
. 从那里开始,一切都将与该位置相关,因此,如果有人尝试像这样访问您的站点:example.com/folder/file.php
,HTTP 服务器会将他们指向public_html/folder/file.php
.
另一方面,服务器端语言在 HTTP 服务器范围之外工作。例如,PHP 作为一个单独的进程工作,由 HTTP 服务器的一个模块调用(对于 Apache,它是mod_php
)。这允许在 PHP 和您的 Web 服务器之间创建一个接口(以便人们可以看到您的 PHP 脚本的结果)。但是,由于 PHP 是一种服务器端语言,它可以访问 Web 根目录 ( public_html
) 之外的目录。
例如,如果您尝试包含具有绝对文件名的文件,如下所示:
<?php
include '/foo.txt';
?>
第一个斜线告诉 PHP 解释器您提供的是绝对路径。如果你省略那个斜线,PHP 会认为路径是相对于你当前文档的(或者你使用 PHP 的set_include_path
函数设置的包含路径)。PHP 实际上会尝试从根目录获取该文件。使用 Hostgator,您的根目录将是您的主目录,或者是您通过 FTP 登录时看到的目录。作为 Hostgator 的一项安全措施,您被关押在此目录中。您的实际主目录可能类似于/home/user_name_goes_here
,并且您的public_html
文件夹位于/home/user_name_goes_here/public_html
. 但是你不能离开你的主目录,因为这会带来安全风险,所以你被限制在你的主目录中,因此它成为你的根目录。
然而,在我的本地系统上,我有 root 访问权限(root = 超级管理员),我的根目录是文件系统根目录(相当于C:\
在 Windows 上,假设你在 partition 上安装了 Windows C
)。考虑到这一点,您可以包含任何文件,例如:
<?php
include include '/etc/apache2/apache2.conf';
?>
上述命令包括 Apache 配置文件(在我的系统上位于/etc/apache2
)。但是,在您的 Hostgator 服务器上,PHP 会尝试从/home/user_name_goes_here/etc/apache2/apache2.conf
. 开始有意义了?
Web 根目录之外的文件放在public_html
目录上方,如下所示:
└── /
├── etc
├── mail
├── public_ftp
├── public_html
│ ├── css
│ ├── images
│ ├── javascript
│ └── upload
├── config.php
└── tmp
在此树中,文件 config.php 位于 Web 根目录之外,无法通过 HTTP 访问。
但是,即使您将这些文件放在public_html
文件夹中,其中的 PHP 代码也永远不会显示给浏览器。因此,虽然将您的敏感文件放在 Web 根目录之外似乎是一种很好的安全措施,但它并没有真正带来那么多额外的安全性。
别人查看应用程序源代码的唯一方法是登录服务器,通过终端或各种文件传输协议(SSH、FTP、SFTP、telnet、cPanel..)。
您还可以使用.htaccess
. 可以禁止访问单个文件和文件夹,但 PHP 仍然可以访问它们(如前所述,它在 HTTP 服务器之外工作)。您还可以使用某些查看者将其列入黑名单和白名单.htaccess
(例如,基于他们的 IP 地址,或者他们是否有特定的 cookie 集)。
禁用文件夹列表是一件好事,这基本上意味着如果目录中不index
存在文件,则目录内容不会通过浏览器列为树。在许多框架和 CMS 系统中,您会看到每个目录都包含一个空index.html
文件。这是作为一项额外的安全措施来完成的,以防您不限制文件夹列表(这些框架/CMS 系统背后的好人正在注意您)。