服务器上PHP源代码的安全性

5
我是一个PHP新手,有一个与PHP安全相关的问题。在默认配置下,是否有人可以获取运行在服务器上的PHP脚本文件的源代码?如果是这样,最好的保护方式是什么?我问这个问题是因为当我请求一个网站的页面时,碰巧下载了一个PHP文件,这引发了我的担忧。我认为可能是Apache配置错误,将那个文件像普通文件一样提供给我,但我不确定。另外,最好的地方存放“敏感”数据,例如数据库或SMTP配置是什么?
谢谢, Alex
8个回答

5

对于最敏感的信息,我建议将其放在网站根目录之外,并通过"require"或"include"包含它。这样,即使服务器上的某些配置出现问题,访问者也只会看到"include('secret_stuff.php');"这一行,而不是实际的脚本。


1
然而,在共享托管服务上将文件放在文档根目录之外通常不是一个选项。 - casablanca
在共享主机上,我有使用过(mediatemple、hostgator、godaddy),这是一种选择。通常,您会有一个名为“html”或“public_html”的文件夹,被认为是您的Web根目录。在该目录下的任何内容都无法从互联网访问。我认为99%的可靠主机都会为共享主机的客户提供此防火墙。这是最基本的安全措施之一。 - dmgig
你的目录下面的任何内容都无法从互联网访问。我想我的意思是在那之上的内容。 - dmgig
标准的Apache配置总是拒绝发送文件名以".ht"开头的文件。如果意外地发送了"* .php"文件作为源代码,则可以提供额外的保护。 - bart
@casablanca,如果您使用共享主机,我可以打赌黑客可以利用比这更多的漏洞。 - RobertPitt
显示剩余4条评论

3

和David Dorward所说的一样,但我建议您查看以下补丁,该补丁将修改apache,以便在存在配置错误时不发送源代码问候语。

http://mirror.facebook.net/facebook/patches/ap_source_defense.patch

补丁如下:

   cd apache-1.3.x
   patch -p1 -i ap_source_defense.patch

Facebook开发团队发布了更多的补丁:http://mirror.facebook.net/facebook/patches/


保护您所需的源代码的最佳方法是将它们放在公共根目录之外,因为如果Apache正在运行,它将无法直接从public_html文件夹中提供文件。

例如:

C:/server/apache/
C:/server/apache/htdocs/
C:/server/apache/htdocs/includes/

人们可以通过访问 /files 来查看文件。
http://hostname.tld/includes/

但是拥有以下目录结构:

C:/server/apache/
C:/server/apache/includes/
C:/server/apache/htdocs/

然后在其中

    C:/server/apache/htdocs/index.php

you have

<?php
    require_once('../includes/config.php');
?>

这应该保护除了视图文件(index.php)之外的所有主要文件。


2
如果服务器没有配置处理PHP文件,则会将它们视为任何其他未知文件(并将它们作为text/plainapplication/octet-stream提供)。
据我所知,PHP支持始终作为扩展或外部程序(用于CGI、FastCGI等),而不是HTTP服务器的内置功能。

奇怪的例外是Nanoweb,它是用PHP编写的,因此具有内置的PHP支持。 - mario

0
如果您的apache.httpd.conf文件中有这行代码,
AddType application/x-httpd-php .php

Apache 应该处理数据,而不是显示它们...

此外,您需要启动 PHP 服务。


0
如果服务器已正确配置以运行PHP代码,则没有直接访问服务器的人可以查看PHP源代码。您不需要做任何其他事情。
只有因为该服务器未配置为运行PHP,而是将其作为文本提供,您才能看到源代码。

0

你描述的“默认配置”是没有安装php(或禁用了php)的Web服务器。在这些情况下,可以轻松地下载php脚本。

确保安装了php(它将在约100%的生产php服务器上安装),并/或者使用像这样的.htaccess文件阻止对配置文件的访问:

<FilesMatch "^config.php$">
    Order allow,deny
    Deny from all
</Files>

如果你想要更加巧妙(并且在一些忽略.htaccess文件的服务器上也能工作),可以在配置文件前面加上.ht,例如.ht.config.php。大多数Apache(和其他一些Web服务器)配置都会拒绝提供以.ht开头的文件。然而,一般来说,确保没有任何Web服务器提供你的文件的唯一方法是将其移动到服务器文档目录之外的目录中。但是,在大多数主机上,你或者你的PHP脚本可能无法访问这些目录。


0

你的第二个问题是配置错误。尽管可能会有选项构建重写规则以防止意外访问,但你不能做太多。

最好的预防措施是将所有脚本放在DOCUMENT_ROOT之外。只需在那里留下一个单独的index.php,并从那里包含所有依赖项。这也是避免配置数据泄漏的最佳策略(敏感数据也不要使用ini文件,而是使用.php脚本)。

另一个担忧是共享托管服务器。服务器上的所有并发用户都可以读取您的脚本(如果不通过PHP,则可以通过Perl / bash CGIs进行)。除非更改为支持通过suexec运行一切并允许个别权限的专业托管商,否则无法对此做任何事情。


0

嗯,“默认配置”是一个含糊的术语,但只要Web服务器通过PHP配置解析 .php 文件,则从那个角度来看您应该没问题。如果您自己的脚本恰好解析其他PHP文件(例如模板系统),则需要确保其中没有任何漏洞,因为PHP脚本可以完全访问服务器上的文件。

假设这些都得到了解决,您不需要将“敏感”数据放在任何特殊位置,只需将它们放在您的 .php 文件中,但请确保所有脚本以 .php 结尾(例如 config.inc.php ),以便始终通过PHP解析而不作为纯文本发送。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接