隐藏 PHP

一般来说,通过模糊手段实现的安全性是安全性最薄弱的形式之一。但在某些情况下,任何一点点额外的安全性都是有益的。

几种简单的技术可帮助隐藏 PHP,可能会减缓试图查找系统中的弱点的攻击者的速度。通过在 php.ini 文件中将 expose_php 设为 off,可以减少向他们显示的信息量。

另一种策略是将 Web 服务器(如 apache)配置为通过 PHP 解析不同的文件类型,可以使用 .htaccess 指令或在 apache 配置文件中本身进行。然后可以使用有误导性的文件扩展名

示例 #1 将 PHP 隐藏为另一种语言

# Make PHP code look like other code types
AddType application/x-httpd-php .asp .py .pl
或将其完全隐藏

示例 #2 对 PHP 扩展名使用未知类型

# Make PHP code look like unknown types
AddType application/x-httpd-php .bop .foo .133t
或将其隐藏为 HTML 代码,这会略微影响性能,这是因为所有的 HTML 将通过 PHP 引擎进行解析

示例 #3 对 PHP 扩展名使用 HTML 类型

# Make all PHP code look like HTML
AddType application/x-httpd-php .htm .html
要高效地执行此操作,必须使用上述扩展名重命名 PHP 文件。虽然这是一种模糊性安全性形式,但它是一种缺点很少的次要预防措施。

添加备注

用户贡献备注 26 备注

rustamabd at google mail
17 年前
到目前为止,我还没有看到一个能将 /foo/bar 转换成功能的 /foo/bar.php,所以我创建了自己的转换函数。它可以在顶级目录和子目录中使用,并且不需要硬编码 RewriteBase。

.htaccess

RewriteEngine on

# 重新排列 /foo/bar 到 /foo/bar.php
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]

# 如果原始请求为 /foo/bar.php,则返回 404
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]

# 注意!对于 Windows 上的 APACHE,请像这样将 [NC] 添加到 RewriteCond
# RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]
anon at example dot com
10 年前
会话名默认为 PHPSESSID。它可用作发送给用户网络浏览器/客户端的会话 cookie 的名称。(示例:PHPSESSID=kqjqper294faui343o98ts8k77)。

为了隐藏此信息,请在调用 session_start() 之前使用 $name 参数将 session_name() 设置为通用名称。示例

session_name("id");
session_start();

干杯。
Sajith Karunatilake @
一年前
如果代码本身存在缺陷,那么忽略它并不像“安全”一样好。最终无论文件的扩展名是什么,代码都必须运行。这种方法可能会有一些优势。但它并不能阻止某人(不是脚本小子或某种自动机器人)利用代码中的缺陷。

只是个想法。

留此评论只是为了防止初学者将此用作一种合法的安全措施(假设他们能阅读文档)。此功能很酷。
marpetr at NOSPAM dot gmail dot com
18 年前
我认为在 Apache 和 Apache 本身隐藏 PHP 的最好方法是

httpd.conf
-------------
# ...
# 最小化“服务器”头信息。
ServerTokens Prod
# 禁用服务器生成的页面上的服务器签名。
ServerSignature Off
# ...
# 默认设置文件类型为 PHP。
DefaultType application/x-httpd-php
# ...

php.ini
------------
; ...
expose_php = Off
; ...

现在 URL 将如下所示
http://my.server.com/forums/post?forumid=15

现在黑客知道你只在用 Apache。
sandaimespaceman at gmail dot com
15 年前
将 INI 指令“expose_php”设为“off”也有帮助。
你可以通过使用来欺骗你的 PHP 转到 ASP.NET
<?php
error_reporting
(0);
header("X-Powered-By: ASP.NET");
?>
匿名
21 年前
补充。如果你想使用漂亮的 URL(即隐藏你的 .php 扩展名),并且你启用了 safe-mode=on,那么先前的示例(ForceType)将不适合你。问题在于 safe-mode 强制 Apache 遵守请求的 URL 中的后缀字符。这意味着

http://www.example.com/home

将仍在我们的文档根目录中由家庭脚本处理,但对于

http://www.example.com/home/contact_us.html

apache 实际上会在我们的文档根目录中查找 /home/contact_us.html 文件。

我找到的最佳解决方案是设置虚拟主机(我对所有内容都这样做,甚至是默认文档根目录),并覆盖虚拟主机中的尾随字符处理。因此,对于在端口 8080 上侦听的虚拟主机,apache 指令将如下所示

<VirtualHost *:8080>
DocumentRoot /web/doc_root
Alias /home "/web/doc_root/home.php"
AcceptPathInfo On
</VirtualHost>

有些人可能会质疑,为什么我们重写尾部字符的处理(使用 AcceptPathInfo 指令),而不只是关闭 safe-mode=off。原因在于,安全模式对整个服务器设置全局限制,然后可以针对每个具体的虚拟主机将其打开或关闭。这相当于在防火墙上阻止所有连接,然后再只打开您需要的连接,这比全局将所有内容保持为开放状态要安全得多,而且您假设您的程序员绝不会忽视可能的漏洞。
mmj
20 年前
您可以通过将以下内容添加到 URL 末尾,查看是否有人使用 PHP
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
如果页面使用 PHP,它将会显示 PHP 署名。

在 php.ini 中将 expose_php 设置为关闭可以防止这种情况。
benjamin at sonntag dot fr
19 年前
针对先前的消息,对于 apache 来说,有一个更简单的方法来设置没有“.”的文件通过 PHP 执行,只需将其放在 “ .htaccess” 文件中

DefaultType application/x-httpd-php
ldemailly at qualysNOSPAM dot com
20 年前
将 MultiViews 添加到您的 apache Options 配置中
让您在 URL 中隐藏/省略 .php,无需进行重写等...
Pyornide
15 年前
在 PHP 中隐藏 X-Powered-By 是建立安全性的错误尝试。正如手册所表明的,模糊不清不是安全性。如果我要利用某个网站,我不会检查该网站运行什么脚本语言,因为我唯一要做的就是利用它。隐藏您使用 [x] 语言这一事实无法阻止我绕过安全性差的方面。
CD001
14 年前
无论如何,“隐藏”PHP 都是一个好主意,因此您可以编写 RESTful web 应用程序。

使用 Apache Mod Rewrite

RewriteEngine On
RewriteRule ^control/([^/]+)/(.*)$ sitecontroller.php?control=$1&query=$2

然后,您可以使用类似于以下内容的函数从 $_GET superglobal 检索数据(以零索引方式)。

<?php
function myGET() {
$aGet = array();

if(isset(
$_GET['query'])) {
$aGet = explode('/', $_GET['query']);
}

return
$aGet;
}
?>

当然这只是一个非常基本的示例——使用 Mod Rewrite 和自定义“GET”函数可以完成很多工作。
info at frinteractives dot com
9 年前
试试这个
RewriteEngine On

# 除非是目录,否则删除结尾斜杠
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://example.com/folder/$1 [R=301,L]

# 将外部 .php 请求重定向到无扩展名 URL
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://example.com/folder/$1 [R=301,L]

# 为无扩展名 php url 解析 .php 文件
RewriteRule ^([^/.]+)$ $1.php [L]
yasuo_ohgaki at yahoo dot com
22 年前
要隐藏 PHP,需要以下 php.ini 设置

expose_php=Off
display_errors=Off

以及在 httpd.conf 中

ServerSignature Off
(最小化效果,但我更喜欢关闭)
jtw90210
19 年前
要在更近版本的 PHP 中使用 PATH_INFO 来传递使用隐藏程序/结尾斜杠/"美观 URL" 的参数,必须将 "AcceptPathInfo On" 添加到您的 httpd.conf。

AddType application/x-httpd-php .php .html
AcceptPathInfo On

在您的 phpinfo 页面中试一试,您就可以搜索 PATH_INFO。

http://example.com/myphpinfo.php/showmetheway

如果您想删除 .php,可以使用其中一种或两种方法
DefaultType application/x-httpd-php
ForceType application/x-httpd-php
Anonymous
20 年前
记住,如果您真的对隐藏 PHP 非常重视,GD 会暴露您。

继续——使用 GD 创建一个图像,然后用文本编辑器打开它。在某个地方,您会看到一个带有 gd 和 php 的注释。
m1tk4 at hotmail dot com
22 年前
我通常这样做

<code>
RewriteEngine on<br>
RewriteOptions inherit<br>
RewriteRule (.*)\.htm[l]?(.*) $1.php$2 [nocase]<br>
</code>

在 .htaccess 中。您需要为这一部分安装 mod_rewrite。
istvan dot takacsNOSPAM at hungax dot com
22 年前
并且使用
ServerTokens min
指令在您的 httpd.conf 中隐藏在 Apache 中已安装的 PHP 模块。
l0rdphi1 at liquefyr dot com
21 年前
更多乐趣包括没有文件扩展名的文件。

只需将 ForceType application/x-httpd-php 位添加到 Apache .htaccess,即可设置。

哦,是的,当您使用以下内容进行播放时,它会变得更好

<?php
substr
($_SERVER['PATH_INFO'],1);
?>

例如 www.example.com/somepage/55



<?php
foreach ( explode('/',$_SERVER['PATH_INFO']) as $pair ) {
list(
$key,$value) = split('=',$pair,2);
$param[$key] = stripslashes($value);
}
?>

例如 www.example.com/somepage/param1=value1/param2=value2/etc=etc

享受 =)
Bryce Nesbitt at Obviously.COM
21 年前
对您所有的脚本使用 .php 扩展名并非必要,事实上可能是有害的(通过暴露关于您的服务器的过多信息,以及限制您在将来可以执行的操作,而无需断开链接)。有几个方法可以隐藏您的 .php 脚本扩展

(1) 根本不要对文件类型进行硬编码。不要指定任何点,大多数网络服务器将自动找到您的文件,如 .php、.html、.pdf、.gif 或其他匹配的文件。这称为规范 URL 格式
www.xxxxxx.com/page
www.xxxxxx.com/directory/
这为您提供了将来的灵活性,并防止 Windows 浏览器对文件类型进行不适当的假设。

(2) 在 Apache .htaccess 文件中,使用
RewriteEngine on
RewriteRule page.html page.php

(3) 强制网络服务器将所有 .html 文件解释为 .php
AddType application/x-httpd-php .php3 .php .html
simon at carbontwelevedesign dot co dot uk
18 年前
我在 .htaccess 文档中使用以下内容

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

然后是以下的简单代码

<?php

$permalinks
= explode("/",$_SERVER['REQUEST_URI']);

$varone = $permalinks[1];
$vartwo = $permalinks[2];

...

?>
php at user dot net
20 年前
在 .htaccess 文件中,以下情况如何?

RewriteEngine on
RewriteRule ^$ /index.php [L]
RewriteRule ^([a-zA-Z0-9\-\_/]*)/$ /$1/index.php [L]
RewriteRule ^([a-zA-Z0-9\-\_/]*)\.(html|htm)$ /$1.php [L]
RewriteRule ^([a-zA-Z0-9\-\_/]*)$ /$1.php [L]

键入“sub.domain.foo/anything”会加载“/anything/index.php”,如果“anything”是目录,否则会加载“/anything.php”。

我敢肯定你可以找到更好的,但它在我的网站上非常棒 :)
php at vfmedia dot de
20 年前
我找到了一个隐藏 php 代码的简单方法,并且 uri 可以通过谷歌等搜索(仅适用于 unix 或 linux)...

首先,我在 hide.conf 中有一些规则(我为它额外创建了一个 .conf(apache 2.0))

例如,当我希望隐藏 index.php 时

<Files index>
ForceType application/x-httpd-php
</Files>

我的问题是,我的代码应该是可读的...

所以我创建了一个额外的文件夹,例如 srv/www/htdocs/static_output

我的 php 代码位于包含文件夹中....(例如 mnt/source/index.php)

然后我在 shell 中创建了一个链接 > ln mnt/source/index.php srv/www/htdocs/static_output/index

这样代码在我的包含文件夹中是可读的(带有 .php 扩展名),而 srv 文件夹中仅有一个无扩展名的链接(由浏览器调用...)。
omolewastephen at gmail dot com
6 年前
我在自己的网站上使用了这个方法,并且它对我来说非常有效

# RewriteEngine on

# 重新排列 /foo/bar 到 /foo/bar.php
# RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]

# 如果原始请求为 /foo/bar.php,则返回 404
# RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
# RewriteRule .* - [L,R=404]

# 注意!对于 Windows 上的 APACHE,请像这样将 [NC] 添加到 RewriteCond
# RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]
Ryan
12 年前
隐藏 php 的另一种方法是完全删除扩展名,如下所示

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)$ /$1.php [L,QSA]

希望有帮助!
sth at panix dot com
22 年前
对此面的翻转是,如果您正在运行一个版本的
PHP/Apache 以没有已知漏洞为特征(通常为当时最新的稳定版本),攻击者看到此,可能在尝试前就放弃。如果不放弃,他们可能会继续尝试利用漏洞。

这实际取决于攻击者的类型。受教育、阅读安全建议的攻击者 Vs. 街边黑客。

如果继续进行修补,版本公开不会成为问题。
Raz
16 年前
有些服务器可能不允许您放置此行(即它不起作用)

AddType application/x-httpd-php .asp .py .pl

DefaultType application/x-httpd-php

因此,真正的替代方法是

1- 在您的 .htaccess 文件中写

RewriteEngine on
RewriteBase /dire/ 或仅 /
RewriteRule securename yourfile\.php [T=application/x-httpd-php]

例如:类似于所有 URL
www.example.com/securename 解析为
www.example.com/yourfile.php

2- 但此处 $_GET 不起作用,但 $_POST 起作用,因此对于类似这样的动态页面
www.example.com/yourfile.php?page=1 使用
www.example.com/securename?page=1

现在:代替使用 $_GET 使用
<?php
$uri
= $_SERVER['REQUEST_URI'];
$page = strstr($uri, '=');
$page = substr($page, 1);
$valid_pages = array('1', '2','...');
$page = in_array($page, $valid_pages) ? $page : '1';
//....
?>

对于错误的 URL,您可以将此代码添加到 .htaccess 文件中
当然,在 .htaccess 中的第一行代码的下方
#--
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ http://www.example.com/securename [L]
To Top