Php 网络托管安全

Php 网络托管安全,php,security,web-hosting,Php,Security,Web Hosting,我有一些关于web托管的安全问题,web根。我已经用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.j

我有一些关于web托管的安全问题,web根。我已经用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。我读过一篇帖子说“在web根目录下上传文件”,web根目录下是什么

这个
here/public\u html/
或者这个
public\u html/here

问题2。我有几个重要的php文件,比如connect_database.php,我应该将这个文件存储在connect_database.php/public_html中,这样就没有人可以访问它了。(此文件适用于每次我的应用程序需要连接到db时都包含在内)尽管php文件仅适用于服务器

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

我使用htaccess设置了几个重要文件夹
Deny from all
(如backup db folder等)和
选项-索引

问题1。我读过一篇帖子说“在web根目录下上传文件”,web根目录下是什么

这里是
here/public\u html/

问题2。我有几个重要的php文件,比如connect_database.php,我应该将这个文件存储在connect_database.php/public_html中,这样就没有人可以访问它了。(此文件适用于每次我的应用程序需要连接到db时都包含在内)尽管php文件仅适用于服务器

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

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


不要忘记您的htaccess文件具有正确的配置,例如禁用的文件夹列表,但除此之外,如果您小心使用脚本,不会发生太严重的问题,这就是保持它没有漏洞。

首先,让我们从主目录的基本树结构开始(对于基于cPanel的基本设置):

在您的情况下,这棵树可能略有不同,但或多或少都是相同的

web根目录是HTTP服务器(Apache、Nginx、Lighttpd或其他软件)指向当前域的位置。在典型的cPanel设置中,这是
public\uhtml
目录。因此,如果您的帐户配置为使用域
example.com
,则对该域的所有访问都将直接指向
public\u html
。从这里开始,所有内容都将与该位置相关,因此,如果有人试图访问您的站点,例如:
example.com/folder/file.php
,HTTP服务器会将他们指向
public\u html/folder/file.php

另一方面,服务器端语言在HTTP服务器范围之外工作。例如,PHP作为一个单独的进程工作,由HTTP服务器的一个模块调用(在Apache中,它是
mod_PHP
)。这允许在PHP和web服务器之间创建接口(以便人们可以看到PHP脚本的结果)。然而,由于PHP是一种服务器端语言,它可以访问web根目录以外的目录(
public\uHTML

例如,如果尝试包含具有绝对文件名的文件,如下所示:

<?php
    include '/foo.txt';
?>
上面的命令包括Apache配置文件(在我的系统上位于
/etc/apache2
)。但是,在Hostgator服务器上,PHP会尝试从
/home/user\u name\u goes\u here/etc/apache2/apache2.conf
中包含此文件。开始有意义了

web根目录之外的文件放在
public\u 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集)将某些观众列入黑名单和白名单


禁用文件夹列表是一件好事,这基本上意味着如果目录中不存在
索引
文件,则目录内容不会通过浏览器以树的形式列出。在许多框架和CMS系统中,您会看到每个目录都包含一个空的
index.html
文件。这是一种额外的安全措施,以防您不限制文件夹列表(那些框架/CMS系统背后的好人正在关注您)。

检查您是否遇到此处列出的与用户文件上载有关的任何陷阱:

至少,您应该确保上传的文件不能在服务器上执行,检查它们不能作为HTML资源从其他域通过XSS进行访问,并检查用户是否有权查看上传的文件(如果用户A上传
foo.jpg
,则用户B应无法访问
http://www.example.com/uploads/foo.jpg
-即使重命名了文件,如果没有Authentica,也不应直接访问该文件
<?php
    include include '/etc/apache2/apache2.conf';
?>
└── /
    ├── etc
    ├── mail
    ├── public_ftp
    ├── public_html
    │   ├── css
    │   ├── images
    │   ├── javascript
    │   └── upload
    ├── config.php
    └── tmp