PHP Conference Japan 2024

隐藏PHP

一般来说,安全模糊是安全中最薄弱的形式之一。但在某些情况下,每一点额外的安全都是可取的。

一些简单的技巧可以帮助隐藏PHP,可能会减缓试图发现系统弱点攻击者的速度。通过在php.ini文件中将expose_php设置为off,您可以减少可供他们使用信息的数量。

另一种策略是配置诸如apache之类的Web服务器,通过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 使用HTML类型作为PHP扩展

# Make all PHP code look like HTML
AddType application/x-httpd-php .htm .html
为了使此方法有效,您必须使用上述扩展名重命名您的PHP文件。虽然这是一种安全模糊的形式,但它是一种具有很少缺点的轻微预防措施。

添加注释

用户贡献的注释 23条注释

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:向RewriteCond添加[NC],如下所示
# RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]
anon at example dot com
10年前
会话名称默认为PHPSESSID。它用作发送到用户Web浏览器/客户端的会话cookie的名称。(例如:PHPSESSID=kqjqper294faui343o98ts8k77)。

要隐藏它,请在调用session_start()之前,使用$name参数设置为通用名称调用session_name()。示例

session_name("id");
session_start();

干杯。
Sajith Karunatilake @
1年前
仅仅隐藏它并不像好的“安全”措施,如果代码本身存在缺陷。归根结底,代码必须运行,无论其文件扩展名是什么。这样做可能有一些好处。但它并不能阻止某人(不是脚本小子或某种自动化机器人)利用代码中的缺陷。

只是一个想法。

只是留下此评论以防止初学者将其用作合法的安全措施(假设他们阅读了文档)。不过,很酷的功能。
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
16年前
将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

仍然会由我们文档根目录中的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。原因是safe mode对整个服务器设置了全局限制,然后可以为每个特定的虚拟主机打开或关闭它。这相当于在防火墙上阻止所有连接,然后只打开您想要的连接,这比全局打开所有内容并假设您的程序员永远不会忽略可能的安全漏洞要安全得多。
mmj
20年前
您可以查看某人是否正在使用PHP,只需在URL末尾添加以下内容
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
如果页面正在使用PHP,这将显示PHP版权信息。

在php.ini中将expose_php设置为Off可以防止这种情况。
benjamin at sonntag dot fr
19年前
针对前面的消息,对于apache,有一种更简单的方法来设置没有“.”的文件由PHP执行,只需将此内容放入“.htaccess”文件中

DefaultType application/x-httpd-php
ldemailly at qualysNOSPAM dot com
21年前
将MultiViews添加到您的apache Options配置中
允许您隐藏/省略url中的.php,而无需任何重写等操作……

Pyornide
16年前
在PHP中隐藏X-Powered-By的想法是一种试图建立安全的错误尝试。正如手册中所述,模糊性不是安全性。如果我要利用一个网站,我不会检查该网站运行的脚本语言,因为对我来说唯一重要的是利用它。隐藏你使用[x]语言的事实并不能阻止我绕过糟糕的安全性。
CD001
14年前
无论如何,“隐藏”PHP是一个好主意,这样你就可以编写一个RESTful Web应用程序。

使用Apache Mod Rewrite

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

然后,你可以使用如下函数作为一种从$_GET超级全局变量中(以零索引的方式)检索数据的方法。

<?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
(min有效,但我更喜欢off)
jtw90210
19年前
为了使PATH_INFO能够工作,以便在更新版本的PHP中使用隐藏的程序/尾部斜杠/“漂亮URL”传递参数,你必须在你的httpd.conf中添加“AcceptPathInfo On”。

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的注释。
istvan dot takacsNOSPAM at hungax dot com
22年前
并在你的httpd.conf中使用
ServerTokens min
指令来隐藏Apache中已安装的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才能使用它。
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) 完全不要硬编码文件类型。不要指定任何点,大多数Web服务器会自动找到你的.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) 强制Web服务器将所有.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'是目录,则加载“/anything/index.php”,否则加载“/anything.php”。

我相信你可以找到更好的方法,但它在我的网站上运行良好:)
php at vfmedia dot de
20年前
我找到了一种隐藏PHP代码的简单方法,并且URI可以通过Google和其他搜索引擎进行搜索……(仅限于Unix或Linux)

首先,我在我的hide.conf中有一些规则(我为此创建了一个额外的.conf文件(Apache 2.0))

例如,当我想屏蔽index.php时

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

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

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

我的PHP代码在includefolder中……(例如mnt/source/index.php)

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

所以代码在我的includefolder中是可读的(带有.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:向RewriteCond添加[NC],如下所示
# RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$" [NC]
To Top