4

我有一些关于网络托管、网络根的安全问题。我已经在 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.)

我读了几篇文章,对网络根安全感到困惑,我感到困惑

Q1。我读过一篇文章说“在网络根目录下上传文件”,网络根目录下是什么?

这个here/public_html/或这个public_html/here

Q2。我有几个 php 文件很重要,比如 connect_database.php,我应该将此文件存储在 connect_datatbase.php/public_html 中,这样没有人可以访问它。(此文件用于每次我的应用程序需要连接到数据库时包含)虽然 php 文件仅适用于服务器

问:当我将所有文件上传到服务器并公开时,我还需要注意哪些其他重要事项?

我已经使用 htaccess 设置了几个重要的文件夹Deny from all(如备份 db 文件夹等)和Options -Indexes

4

4 回答 4

6

首先,让我们从主目录的基本树结构开始(对于基于 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 系统背后的好人正在注意您)。

于 2013-10-02T12:13:30.960 回答
3

Q1。我读过一篇文章说“在网络根目录下上传文件”,网络根目录下是什么?

它是here/public_html/

Q2。我有几个 php 文件很重要,比如 connect_database.php,我应该将此文件存储在 connect_datatbase.php/public_html 中,这样没有人可以访问它。(此文件用于每次我的应用程序需要连接到数据库时包含)虽然 php 文件仅适用于服务器

这并不重要。您不应该能够通过 http 请求读取源代码。访问您的 connect_database.php 的唯一方法是访问 ssh 或 ftp 或类似的东西或文件包含等漏洞,如果发生这种情况 - 您将配置存储在哪里并不重要。

问:当我将所有文件上传到服务器并公开时,我还需要注意哪些其他重要事项?

不要忘记具有正确配置的 htaccess 文件,例如禁用的文件夹列表,但除此之外,如果您小心使用脚本,则不会发生任何严重的事情,那就是保持它免受漏洞的影响。

于 2013-10-02T11:43:51.843 回答
0

检查您没有遇到此处列出的有关用户文件上传的任何陷阱:https ://www.owasp.org/index.php/Unrestricted_File_Upload

至少您应该确保上传的文件不能在您的服务器上执行,检查它们不能作为 HTML 资源从其他域访问以通过 XSS 攻击,并检查用户是否有权查看上传的文件(如果用户A 上传foo.jpg,用户 B 不应该能够访问http://www.example.com/uploads/foo.jpg- 即使文件被重命名,它也不应该在没有身份验证的情况下直接访问)。

于 2013-10-03T10:16:14.387 回答
0

Q1。我读过一篇文章说“在网络根目录下上传文件”,网络根目录下是什么?

这个这里/public_html/ 或者这个public_html/这里

其他一些答案有这个错误。“网络根”下面的意思是public_html/here. 换句话说:网络根目录是可通过网络访问的顶级目录!

here/public_html不是您的网络根。这是您的“帐户根”。换句话说:可以通过 FTP 访问的顶级目录。

另外,有些人可能对“下面”的含义感到困惑。here/public_html/在上面public_html/here,下面是here/public_html/。这是计算机科学的普遍惯例:树,包括目录树,从上到下生长。您打开的目录越多,您就越“低于”。

于 2018-10-02T13:47:31.397 回答