2016-09-12 27 views
5

如何讓Apache的.htaccess文件檢查PHP是否啓用?我嘗試了諸如<IfModule !mod_php7.0.c><IfModule !mod_php7.c>之類的東西,但是當我啓用/禁用模塊時,它似乎沒有做任何事情。如果啓用PHP,如何檢入.htaccess?

我希望在我的.htaccess中有一個回退功能,該功能拒絕所有禁用PHP時的所有訪問。爲了防止純文本PHP代碼泄漏。

我想要做這樣的事情:

# If PHP is not installed, deny all access to .php files to prevent PHP code leakage 
<IfModule !mod_php7.c> 
    <FilesMatch \.php$> 
     order deny,allow 
     deny from all 
    </FilesMatch> 
</IfModule> 

最終它會檢查類似if php7 AND php5 AND php4 are disabled, deny access。有任何想法嗎?

此外,當AllowOverride爲無,因此.htaccess文件沒有做任何事情。有什麼選擇,以防止PHP代碼泄漏在明文?

+2

訣竅(最佳實踐)是不將PHP源代碼放在'public_html'文件夾中;-)這樣,兩種情況都可以正確解決。 – DanFromGermany

+0

我已經這樣做了。我只把index.php文件放在了public_html文件夾之外。但我想我可以移動一切,並有一個PHP文件,其中包括根外的另一個。在這種情況下,最糟糕的情況是,一個包含一行的php文件包含泄漏。對? –

+2

是的,有幾種方法,您提到的方法可能是最簡單和最簡單的方法。 – DanFromGermany

回答

3
<IfModule !mod_php5.c> 
    <FilesMatch ".+\.php$"> 
     Order Deny,Allow 
     Deny from all 
    </FilesMatch> 
</IfModule> 

在Apache的2.4

<IfModule !mod_php5.c> 
    <FilesMatch ".+\.php$"> 
     Require all denied 
    </FilesMatch> 
</IfModule> 

在Apache的2.4有幾個新的有用的功能:defineifdefineif, else, ifelse

以下我們可以在默認情況下拒絕,只有在定義了PHP_IS_ENABLED的情況下才能啓用。

<IfModule mod_php5.c> 
    Define PHP_IS_ENABLED 
</IfModule> 

<IfModule mod_php7.c> 
    Define PHP_IS_ENABLED 
</IfModule> 

# ... 

<IfDefine !PHP_IS_ENABLED> 
    <FilesMatch ".+\.php$"> 
     Require all denied 
    </FilesMatch> 
</IfDefine> 
+1

謝謝,但如果mod_php5未加載但PHP 4或7是? –

+0

在apache 2.4中,我認爲我們可以利用一些新功能來獲得你想要的。 –

+0

'.htaccess'中不允許定義'' – cronfy

1

這裏是要檢查PHP的多個版本(例如, 「如果PHP 5 OR PHP 7已啓用」),確實工作在.htaccess的解決方案。

它需要Apache 2.4與mod_env模塊(99%在您的主機上啓用)。

<IfModule mod_php5.c> 
    SetEnv PHP_IS_ENABLED yes 
</IfModule> 

<IfModule mod_php7.c> 
    SetEnv PHP_IS_ENABLED yes 
</IfModule> 

<If "reqenv('PHP_IS_ENABLED') == 'yes' || reqenv('REDIRECT_PHP_IS_ENABLED') == 'yes'"> 
    ... your directives 
</If> 

REDIRECT_PHP_IS_ENABLED需要使用mod_rewrite內部重定向的請求進行此項工作。