2024 年日本 PHP 會議

隱藏 PHP

一般而言,以隱蔽來達成安全是最弱的安全形式之一。但在某些情況下,額外的安全性總是令人嚮往的。

一些簡單的技巧有助於隱藏 PHP,可能會減緩試圖發現系統漏洞的攻擊者。在您的 php.ini 檔案中將 expose_php 設定為 off,即可減少他們可取得的資訊量。

另一種策略是將網頁伺服器(例如 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 使用 HTML 類型作為 PHP 擴充

# Make all PHP code look like HTML
AddType application/x-httpd-php .htm .html
為了使其有效運作,您必須使用上述擴充來重新命名您的 PHP 檔案。雖然這是一種透過隱蔽來達成安全的形式,但它是一種小型的預防措施,幾乎沒有缺點。

新增筆記

使用者貢獻的筆記 23 則筆記

42
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]
25
anon at example dot com
10 年前
工作階段名稱預設為 PHPSESSID。這會用作傳送給使用者網頁瀏覽器/用戶端的工作階段 Cookie 名稱。(範例:PHPSESSID=kqjqper294faui343o98ts8k77)。

若要隱藏此名稱,請在使用 session_start() 之前呼叫 session_name(),並將 $name 參數設定為一般名稱。範例

session_name("id");
session_start();

乾杯。
3
Sajith Karunatilake @
1 年前
如果程式碼本身有缺陷,那麼單純隱藏它看起來並不是良好的「安全性」。最終,無論其檔案副檔名為何,程式碼都必須執行。這可能有一些優點。但它並不能阻止某人(不是腳本小子或某種自動化的機器人)利用程式碼中的缺陷。

只是想到了這一點。

只是留下此評論,以防止初學者將此作為合法的安全措施(假設他們閱讀文件)。雖然是很酷的功能。
15
marpetr at NOSPAM dot gmail dot com
18 年前
我認為在 Apache 和 Apache 本身隱藏 PHP 的最佳方法是這樣

httpd.conf
-------------
# ...
# 最小化「Server」標頭資訊
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。
11
sandaimespaceman at gmail dot com
16 年前
將 INI 指示詞 "expose_php" 設定為 "off" 也會有幫助。
您可以使用以下程式碼,將您的 PHP 詐騙為 ASP.NET
<?php
error_reporting
(0);
header("X-Powered-By: ASP.NET");
?>
10
Anonymous
21 年前
附註:如果您想要使用美觀的 URL(即隱藏 .php 副檔名),並且您已開啟 safe-mode=on,則先前的範例 (ForceType) 對您無效。問題在於安全模式會強制 Apache 接受所請求 URL 中的尾隨字元。這表示

http://www.example.com/home

仍會由我們 doc root 中的 home 腳本處理,但對於

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

Apache 實際上會在我們的 doc root 中尋找 /home/contact_us.html 檔案。

我找到的最佳解決方案是設定虛擬主機(我對所有內容都這樣做,甚至是預設 doc root),並覆寫虛擬主機內部的尾隨字元處理。因此,對於監聽埠 8080 的虛擬主機,Apache 指示詞看起來會像這樣

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

有些人可能會質疑我們為什麼要覆寫尾隨字元處理(使用 AcceptPathInfo 指示詞)而不是直接關閉 safe-mode=off。原因是安全模式會對整個伺服器設定全域限制,然後可以針對每個特定的虛擬主機開啟或關閉這些限制。這相當於在防火牆上封鎖所有連線,然後僅開啟您想要的連線,這比在全球範圍內讓所有連線都處於開啟狀態,並假設您的程式設計師永遠不會忽略可能的安全漏洞安全得多。
13
mmj
20 年前
您可以透過將以下程式碼新增至 URL 的結尾,來判斷是否有人正在使用 PHP
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
如果頁面正在使用 PHP,則會顯示 PHP 版權聲明。

將 php.ini 中的 expose_php 設定為 Off 可以防止這種情況。
9
benjamin at sonntag dot fr
19 年前
針對先前的訊息,對於 Apache,有一個更簡單的方法可以設定不帶「.」的檔案,讓 PHP 執行,只需將此程式碼放入「.htaccess」檔案即可

DefaultType application/x-httpd-php
10
ldemailly at qualysNOSPAM dot com
21 年前
將 MultiViews 新增至您的 Apache Options 設定
讓您在網址中隱藏/省略 .php,而無需任何重寫等操作...
9
Pyornide
16 年前
在 PHP 中隱藏 X-Powered-By 的想法是一種有缺陷的安全嘗試。正如手冊所示,隱蔽性並非安全性。如果我要攻擊一個網站,我不會檢查該網站運行的是哪種腳本語言,因為對我來說重要的是利用它。隱藏您使用 [x] 語言的事實並不能阻止我繞過糟糕的安全性。
10
CD001
14 年前
無論如何,「隱藏」PHP 是一個好主意,這樣您就可以編寫 RESTful 網路應用程式。

使用 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' 函式做很多事情。
8
info at frinteractives dot com
9 年前
試試這個
RewriteEngine On

# 除非是目錄,否則移除尾部的斜線
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://example.com/folder/$1 [R=301,L]

# 將外部 .php 請求重定向到無擴展名的網址
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://example.com/folder/$1 [R=301,L]

# 為無擴展名的 php 網址解析 .php 檔案
RewriteRule ^([^/.]+)$ $1.php [L]
7
yasuo_ohgaki at yahoo dot com
22 年前
要隱藏 PHP,您需要以下 php.ini 設定

expose_php=Off
display_errors=Off

以及在 httpd.conf 中

ServerSignature Off
(min 有效,但我更喜歡 off)
5
jtw90210
19 年前
為了讓 PATH_INFO 在較新版本的 PHP 中正常運作,以便使用隱藏的程式/尾部斜線/"美觀的網址"傳遞參數,您必須將 "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
6
Anonymous
20 年前
請記住,如果您真的對隱藏 PHP 感到恐慌,GD 會暴露您。

繼續 - 使用 GD 建立影像並使用文字編輯器開啟。在某處您會看到一個包含 gd 和 php 的註解。
5
istvan dot takacsNOSPAM at hungax dot com
22 年前
並使用
ServerTokens min
在您的 httpd.conf 中的指令來隱藏 Apache 中安裝的 PHP 模組。
6
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 才能使用此功能。
5
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

享受吧 =)
1
Bryce Nesbitt at Obviously.COM
21 年前
對所有腳本都使用 .php 副檔名並非必要,事實上,它可能會造成損害(透過暴露過多關於您伺服器的資訊,以及限制您未來在不中斷連結的情況下可以執行的操作)。有幾種方法可以隱藏您的 .php 腳本副檔名

(1) 完全不要硬式編碼檔案類型。不要指定任何點,大多數網路伺服器會自動找到您的 .php、.html、.pdf、.gif 或其他相符的檔案。這稱為規範網址格式
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
-1
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];

...

?>
-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"。

我確信您可以找到更好的方法,但它在我的網站上運作良好 :)
-4
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 資料夾中只有沒有副檔名的連結(瀏覽器會呼叫它...)。
-4
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]
To Top