2017-05-07 22 views
3

我在Apache上使用PHP,並想知道是否有方法可以從客戶端指出所請求的PHP文件不應該被執行/解析。按照標準,我希望在請求時執行所有的PHP文件,但是我想要一種方式來從客戶端指出文件不應該被執行。告訴Apache是​​否對請求執行PHP

一個很好的解決方案是使用JavaScript在請求中提供一個額外的頭文件,然後在.htaccess文件中編寫一些代碼來檢查頭文件是否存在,以及是否告訴apache不執行文件並只提供它作爲文本。

使用GET參數或其他東西也可以。

這可能嗎?如果是這樣,怎麼樣?

+0

看一看[mod_rewrite的(https://httpd.apache.org/docs/current/mod/mod_rewrite.html)。您可以將請求重寫爲一些sendource.php腳本。 –

+0

爲什麼不決定服務器端哪些文件未分析的輸出應該是一個選項,而不是讓客戶端選擇要分析的服務器的文件?這樣,您可以更加確定敏感數據不會泄漏。 –

+0

@LucasKrupinski所有文件都應該可以解析,並且最好默認。對於某些目錄中的文件,我希望發送源代碼作爲選項。 – tjespe

回答

1

在請求中提供額外的頭[使用JavaScript],然後寫一些代碼在.htaccess文件來檢查頭部存在

你可以得到阿帕奇檢查這個(祕密)標題,並在內部將請求重寫爲viewAsSource.php類型的文件,然後讀取REQUEST_URI(或傳遞的查詢字符串參數)並返回文件源。類似於@LucasKrupinski的建議,除了你不需要在PHP文件中包含任何東西。

例如,在根.htaccess文件:

RewriteEngine On 

# Block direct access to any file in the /tools directory 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^tools/ - [F] 

# Display PHP source... 
RewriteCond %{HTTP:X-Action} ^display-source$ 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule (.+\.php)$ tools/display-source.php?url=$1 [L] 

對於所有.php請求此檢查具有「顯示源」的值的X-Action HTTP請求報頭和所請求的文件是否存在。如果滿足這些條件,則將該請求內部寫入/tools/display-source.php腳本,並在url參數中傳遞URL。您可以改爲檢查超全局,但請注意,這還包括在請求上傳遞的任何查詢字符串。

然後,在display-source.php,是這樣的:

<?php 
$url = isset($_GET['url']) ? $_GET['url'] : null; 
if (isset($url)) { 
    $file = $_SERVER['DOCUMENT_ROOT].'/'.$url; 
    // Validate $file.... 
    // : 
    highlight_file($file); 
} 
+0

這似乎正是我想要的解決方案,我會看看如果我可以得到它的工作 – tjespe

+0

我添加了'display-source.php'文件和重定向規則,但是當我嘗試此JS代碼:https:/ /jsfiddle.net/7mz4f49s/響應是一個解析文件。 – tjespe

+0

如果您將_absolute URL_傳遞給'highlight_file()'函數(或任何其他類似的PHP函數),則會發生這種情況。這必須是文件系統路徑。 – MrWhite

2

您的PHP文件可以多加一行嗎?

1號線:<?php include('viewAsSource.php'); ?>

viewAsSource.php:

<?php 
if(isset($_GET['src'])) { 
    $self = $_SERVER['SCRIPT_FILENAME']; 
    $lines = file($self); 

    $output = ''; 
    foreach ($lines as $line) { 
     $output .= nl2br(htmlspecialchars($line)); 
    } 
    echo $output; 
} 

這樣,如果他們要求 「sample.php」 他們得到的分析版本,但如果他們要求「sample.php SRC? 「他們得到的源代碼?

3

您還可以設置在.htaccess文件處理程序(或服務器配置爲好):

<FilesMatch "\.phps$"> 
    SetHandler application/x-httpd-php-source 
    Require all granted 
</FilesMatch> 

然後,你需要設置一個符號鏈接到PHP文件,在Linux系統上:

ln -s filename.php filename.phps 

請求filename.phps時,您將獲得語法高亮顯示的源代碼。

Require all granted是Apache 2.4中的語法。較早的版本使用Allow from allDeny from none