Запрещаем исполнение PHP скриптов через .htaccess

Встала задача запретить использование php сценариев в определённых директориях на сервере. Дело в том, что в некоторые дирректории предназначенные для записи в них изображений позьзователями из свеоей административной панели могут записать php-скрипт. Данная ситуация может крайне негативно сказаться на работе всего хостинга. Обычно после взлома административной панели злоумышленник получает доступ не только к сайту но и другим ресурсам сервера. Часто такие уязвимости используются для рассылки СПАМа.

Давайте разбираться как предотвратить выполнение php программы в директориях, предназначенных для хранения медиа контента. То есть в директориях куда пользователи из своей админ-панели могут записывать свои файлы.

Запретить использование CGI-скриптов в директории

Запрещаем доступ к следующий типам файлов, как к файлам CGI-скриптов. Для этого отключаем работу CGI сценариев. И указываем файлы с каким расширениями относятся к таковым(даже если эти файлы таковыми и не являются).

Options -ExecCGI

AddHandler cgi-script .js .asp .html .xml .exe .php .cgi

Запрет на обращение к указанным типам файлов в директории

Прописываем в .htaccess типы файлов к которым будет запрещён доступ и указываем для них правило - Deny from all (запрещено для всех). Этот и предыдущий способ будут выдавать в браузере ошибку "Forbidden" "You don't have permission to access" (у Вас нет прав доступа). Но изображения, текстовые и музыкальные файлы будут нормально скачиваться. Поэтому используйте этот и предыдущий метод, если Вам нужно запретить выполнение php файла и получение его текстового содержания. Одним способом запретить доступ к файлам с расширением или содержанием php. Методы кторые описаны с статье ниже хотя и не выполняют php скрипты, тем не менее выдают их текстовое содержание. Будте аккуратнее в их использовании.

<Files ~ "\.(php[2-5]?|cgi|py|pl|fcgi|fpl|phtml|shtml|asp|jsp)$">

Deny from all

</Files>

Запрет выполнения php через директиву php_value engine off

Запрещаем работу php сценариев через директиву php_value engine off. Указываем что файлы с указанными расширениями являются x-httpd-php-source. Теперь php файлы в директории в которой находится .htaccess следующего содержания будут выводиться как текстовые. Причём с подсветкой синтаксиса.

php_value engine off

RemoveHandler .pl .cgi .php .php3 .phtml

AddType application/x-httpd-php-source .pl .cgi .php .php3 .phtml

А если заменить последнюю строчку на следущую, тогда подсветки синтаксиса не будет. Кстати так можно сделать даже с изображениями. Отмените тип файла jpg и добавьте к нему заголовки text/html. В этом случаи вместо картинки в браузере можно увидеть бессмысленный текст.

AddType "text/html"

Ещё один способ отключения php через .htaccess

Метод работает следующим образом. Удаляем тип файлов php (RemoveType php). То есть для файлов с расширением php обработчик более не определён и теперь сервер не знает, как обработать данный файл, поэтому выдаст его как текстовый. Обычно одной этой строки достаточно, но если нет, впишите все остальные в Ваш файл .htaccess. Теперь после обращения к php файлы он будет открываться как обыкновеннй текстовый файл. То есть исполняться такой php-сценарий не будет. Тем не менее если пользователь наберёт в своём браузере адрес где находится такой скрипт, то сможет получить его текстовое содержание. Учитывайте это и обратите внимание особенно чтобы в директории не было конфигурационных файлов, в которых могут храниться Ваши пароли. В этом случаи злоумышленник может получить доступ к сайту через панель администратора или базу данных.

RemoveType php

<IfModule mod_php4.c>

php_flag engine 0

</IfModule>



<IfModule mod_php5.c>

php_flag engine 0

</IfModule>

Перенаправление и обработка ситуации в указанном php скрипте.

Ситуацию с вызовом нежелательных php скриптов можно обработать в другом php файле, который мы заранее подготовим. Для этого пропишем в .htaccess правила для перенаправления.

RewriteEngine On

Options +FollowSymlinks

#RewriteBase /

RewriteCond %{REQUEST_URI} !^(.*).(jpg|jpeg|png|bmp|tif|css|js|txt|pdf|doc|docx|mp3|mp4) [NC]

RewriteRule ^(.*)$ index.php [L]

Для тех кто не знаком с правилами Rewrite: Директивой RewriteEngine on активируем модуль перенаправлений. В RewriteCond указываем ситуации на которые перенаправление не распространяется, то есть в данном случаи указываем типы фалов на которые перенаправление не распространяется. Флаг [NC] означает, что типы файлов не зависят от регистра. То есть правила не распространяются как на .jpg так и на .JPG. Список типов файлов тут далеко не полный, так что не забудте его дополнить нужными для работы Вашего сайта.

Сам php осуществляющий обработку может выглядеть примерно так:

<?php
$logfile 
"log.txt";
$fp fopen($logfile,"a");
fwrite($fp,$_SERVER["REQUEST_METHOD"] . " | " $_SERVER["REQUEST_URI"] . " | " $_SERVER["REMOTE_ADDR"] . " | " .  $_SERVER["HTTP_USER_AGENT"] . "\n");
fwrite ($fp,$_SERVER["HTTP_ACCEPT"] . " | " $_SERVER["HTTP_ACCEPT_LANGUAGE"] . " | " $_SERVER["HTTP_ACCEPT_ENCODING"] . "\n");
if (isset(
$_POST)) {
  
fwrite($fp,"POST:\n");
  foreach (
$_POST as $k => $v) {
    
fwrite($fp$k ":" $v "\n");
  }
}
if (isset(
$_COOKIE)) {
  
fwrite($fp,"COOKIE:\n");
  foreach (
$_COOKIE as $k => $v) {
    
fwrite($fp,$k ":" $v "\n");
  }
}
fwrite($fp,"_____________________________________________________________\n");
header("Location: /"true301); 

Данный файл поможет:a) перенаправить посетителя запросившего нежелательный адрес на главную страницу сайта; б) запишет всю информацию которую он пытался передать вредностному скрипту. А именно узнаеи IP адрес, соберёт передаваемые COOKIE, POST и GET данные. А так же укажет на какую именно страницу сайта был отправлен запрос.

Оригинал данной статьи взят с http://mnogomem.ru/zapreshchaem-ispolnenie-php-skriptov-cherez-htaccess и размещён здесь без каких либо исправлений поскольку сайт mnogomem.ru не доступен.

Вы так же можете прочитать следующие статьи: