2016-09-12 21 views
5

Jak mogę sprawdzić, czy plik Apache'a o numerze .htaccess jest włączony, jeśli PHP jest włączone? Próbowałem rzeczy takie jak <IfModule !mod_php7.0.c> i <IfModule !mod_php7.c>, ale wydaje się, że nic nie robi po włączeniu/wyłączeniu modułu.Jak sprawdzić .htaccess, czy PHP jest włączone?

Chciałbym mieć rezerwę w moim .htaccess, która odmawia dostępu ze wszystkich, gdy PHP jest wyłączone. W celu zapobieżenia wyciekowi czystego tekstu kodu PHP.

chcę zrobić coś takiego:

# 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> 

Docelowo będzie to coś sprawdzić jak if php7 AND php5 AND php4 are disabled, deny access. Jakieś pomysły?

Ponadto, gdy parametr AllowOverride ma wartość None, plik .htaccess niczego nie robi. Jakie są opcje, aby zapobiec wyciekowi kodu PHP w postaci zwykłego tekstu?

+2

Sztuczka (najlepsza praktyka) nie umieszcza kodu źródłowego PHP w folderze 'public_html'; w ten sposób obie sprawy są rozwiązywane poprawnie. – DanFromGermany

+0

Już to zrobiłem. Umieszczam tylko plik index.php, który zasadniczo zawiera rzeczy spoza folderu public_html. Ale zakładam, że mogę przenieść wszystko i mieć jeden plik php, który zawiera inny poza rootem. W takim przypadku, w najgorszym przypadku, plik zawierający jeden plik php z jednym zawiera nieszczelności. Dobrze? –

+2

Tak, jest kilka sposobów, o których wspomniałeś jest prawdopodobnie najłatwiejszy i najprostszy. – DanFromGermany

Odpowiedz

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

W Apache'u 2,4

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

W Apache'u 2,4 Kilka nowych użytecznych funkcji: define, ifdefine i if, else, ifelse.

Poniżej można domyślnie odmówić i włączyć tylko, jeśli zdefiniowano 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

Dzięki, ale co, jeśli mod_php5 nie jest załadowany, ale PHP 4 lub 7 jest? –

+0

W apache 2.4 Myślę, że możemy skorzystać z kilku nowych funkcji, aby uzyskać to, co chcesz. –

+0

'Definiuj' nie jest dozwolone w' .htaccess' – cronfy

1

Oto rozwiązanie, by sprawdzić przed wieloma wersjami PHP (na przykład „jeśli php 5 LUB php 7 jest włączona”), który rzeczywiście działa w .htaccess.

Wymaga Apache 2.4 z modułem mod_env (99% jest włączony na twoim hoście).

<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 jest wymagane do tej pracy dla żądań wewnętrznie przekierowanych z mod_rewrite.

Powiązane problemy