我是一个PHP新手,并且有一个php安全问题。是否有人可以获得在具有默认配置的服务器上运行的php脚本文件的源代码?如果是这样,最好的保护方式是什么?我问这个是因为当我从网站请求页面时,我碰巧下载了一个php文件,这引发了我的担忧。我认为也许apache配置错了,并把这个文件作为一个简单的文件提供给我,但我不确定。另外,保存“敏感”数据(如数据库或smtp配置)的最佳位置是什么?
谢谢你, 亚历
答案 0 :(得分:5)
对于最敏感的信息,我建议将其放在您的网络根文件夹之外,并通过“require”或“include”包含它。这样,即使某些配置在服务器上出现问题,访问者也只会获得“include('secret_stuff.php');”行的服务。而不是实际的剧本。
答案 1 :(得分:2)
如果服务器未配置为处理PHP文件,则会将其视为任何其他未知文件(并将其作为text/plain
或application/octet-stream
提供。
据我所知,PHP支持总是作为扩展或外部程序(对于CGI,FastCGI等)提供,而不是作为HTTP服务器的内置。
答案 2 :(得分:2)
正是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/
人们可以专门查看我要去的文件
http://hostname.tld/includes/
但目录结构为:
C:/server/apache/
C:/server/apache/includes/
C:/server/apache/htdocs/
然后在
内 C:/server/apache/htdocs/index.php
你有
<?php
require_once('../includes/config.php');
?>
这应该保护视图文件(index.php
)
答案 3 :(得分:0)
如果服务器已正确配置为运行PHP代码,则无法直接访问服务器的人无法查看PHP源代码。你不必做任何其他事情。
只是因为该服务器未配置为运行PHP,而是将其作为文本提供,您可以看到源。
答案 4 :(得分:0)
如果你的apache.httpd.conf文件中有这一行,
AddType application/x-httpd-php .php
Apache应该处理数据,而不是显示它们......
此外,您还需要启动php服务。
答案 5 :(得分:0)
您所描述的“默认配置”是未安装php(或禁用php)的网络服务器。在这些情况下,可以下载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脚本将无法访问它们。
答案 6 :(得分:0)
您的第二个问题是配置错误。你可以做的并不多,虽然可能(?)可以选择构建一个重写来防止意外访问。
但最好的预防措施是将所有脚本保留在DOCUMENT_ROOT
之外。只需在其中保留一个index.php,并包含所有依赖项。这也是避免泄漏配置数据的最佳策略(也不要使用ini文件来处理敏感数据,但总是使用.php脚本)。
另一个担忧是共享托管服务器。服务器上的所有并发用户都可以读出您的脚本(如果不是通过PHP,那么通过Perl / bash CGI)。除非您改为支持通过suexec
运行并因此允许个人权限的专业主机,否则您无法做到这一点。
答案 7 :(得分:0)
嗯,“默认配置”是一个模糊的术语,但只要Web服务器配置为通过PHP解析.php
文件,从这个角度来看应该没问题。如果您的脚本本身碰巧解析其他PHP文件(例如模板系统),那么您需要确保没有任何漏洞,因为PHP脚本可以完全访问服务器上的文件。
假设这些已被处理,您不需要将“敏感”数据保存在任何特殊位置 - 只需将它们放在.php
文件中,但要确保所有脚本都以{{{}结尾。 1}}(例如。.php
)因此它们总是通过PHP解析而不是以纯文本形式发送。