我有一些关于虚拟主机的安全问题,网页根目录。我用 php 构建了一个 Web 应用程序,我所有的 php、js 和图像文件都放在 public_html 后面(我使用 hostgator(
喜欢这个
public_html/index.php
public_html/images/foo.jpg
public_html/javascript/foo.js
public_html/css/foo.css
public_html/upload/49845165748946.jpg (user upload images to this folder.)
我读了很少的帖子,对 Web 根安全感到困惑,我感到困惑
问题 1.我读过一篇帖子说"上传网络根目录以下的文件",网络根目录下面是什么?
这个here/public_html/
还是这个public_html/here
问题 2.我有几个 php 文件很重要,比如connect_database.php,我应该将此文件存储在 connect_datatbase.php/public_html 中,以便没有人可以访问它。(此文件用于每次我的应用程序需要连接到数据库时包含(虽然 PHP 文件仅适用于服务器
问:当我将所有文件上传到服务器并公开时,还有其他重要的事情需要注意吗?
我已经使用htaccess设置了一些重要的文件夹Deny from all
(如备份数据库文件夹等(和Options -Indexes
首先,让我们从主目录的基本树结构开始(对于基于 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 =超级管理员(,我的根目录是文件系统根目录(相当于Windows上的C:'
,假设您在分区C
上安装了Windows(。考虑到这一点,您可以包含任何文件,例如:
<?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
在此树中,文件配置.php位于 Web 根目录之外,无法通过 HTTP 访问。
但是,即使您将这些文件放在public_html
文件夹中,其中的 PHP 代码也永远不会显示给浏览器。因此,虽然将敏感文件放置在Web根目录之外似乎是一个很好的安全措施,但它并没有真正带来那么多额外的安全性。
某人查看应用程序源代码的唯一方法是通过终端或各种文件传输协议(SSH,FTP,SFTP,telnet,cPanel..(登录到服务器。
您还可以使用 .htaccess
限制对某些文件的访问。可以禁止访问单个文件和文件夹,但 PHP 仍然可以访问它们(如前所述,它可以在 HTTP 服务器之外工作(。您还可以使用.htaccess
将某些查看者列入黑名单和白名单(例如,基于他们的 IP 地址,或者他们是否设置了特定的 cookie(。
禁用的好事是文件夹列表,这基本上意味着如果目录中不存在index
文件,则目录内容将不会通过浏览器作为树列出。在许多框架和CMS系统中,您会看到每个目录都包含一个空的index.html
文件。这是作为额外的安全措施,以防您不限制文件夹列表(这些框架/CMS系统背后的好人正在监视您(。
问题 1.我读过一篇帖子说"上传网络根目录以下的文件",网络根目录下面是什么?
这是here/public_html/
问题 2.我有几个 php 文件很重要,比如connect_database.php,我应该将此文件存储在 connect_datatbase.php/public_html 中,以便没有人可以访问它。(此文件适用于每次我的应用程序需要连接到数据库时包含(,尽管 php 文件仅适用于服务器
这并不重要。您不应该能够通过 http 请求读取源代码。访问connect_database.php的唯一方法是访问 ssh 或 ftp 或类似的东西或文件包含之类的漏洞,如果发生这种情况 - 存储配置的位置并不重要。
问:当我将所有文件上传到服务器并公开时,还有其他重要的事情需要注意吗?
不要忘记具有正确配置的htaccess文件,例如禁用文件夹列表,但除此之外,如果您小心使用脚本,就不会发生太严重的事,那就是保持其免受漏洞的影响。
检查您是否违反了此处列出的有关用户文件上传的任何陷阱:https://www.owasp.org/index.php/Unrestricted_File_Upload
至少你应该确保上传的文件不能在你的服务器上执行,检查它们是否不能作为HTML资源从其他域访问,以便通过XSS进行利用,并检查用户是否有权查看上传的文件(如果用户A上传foo.jpg
,用户B应该无法访问http://www.example.com/uploads/foo.jpg
- 即使文件被重命名,它不应该在没有身份验证的情况下直接访问(。
问题 1.我读过一篇帖子说"上传网络根目录以下的文件",网络根目录下面是什么?
这个在这里/public_html/或这个public_html/这里
其他一些答案有这个错误。在"网络根目录"下方表示public_html/here
。换句话说:网页根目录是通过网页可访问的顶级目录!
here/public_html
不是您的网络根目录。它是您的"帐户根"。换句话说:可通过FTP访问的顶级目录。
此外,有些人可能会对"下面"的含义感到困惑。 here/public_html/
在public_html/here
之上,低于here/public_html/
。这是计算机科学中的普遍惯例:树,包括目录树,从上到下生长。您打开的目录越多,您的"下方"就越多。