Запретить прямой доступ ко всем .php файлам, кроме index.php

Я хочу запретить прямой доступ ко всем файлам .php, кроме одного: index.php

Единственный доступ к другим файлам .php должен быть через php include.

Если возможно, я хочу, чтобы все файлы были в одной папке.

UPDATE:

Общее правило было бы приятным, поэтому мне не нужно проходить через все файлы. Риск в том, что я забыл файл или строку.

ОБНОВЛЕНИЕ 2:

index.php находится в папке www.myadress.com/myfolder/index.php

Я хочу запретить доступ ко всем файлам .php в myfolder и подпапках в эту папку.

Ответ 1

В index.php добавьте значение доступа, подобное этому:

$access = 'my_value';

В каждом другом файле включите эту проверку, прежде чем даже один байт будет эхом отозван php:

if(empty($access)) {
    header("location:index.php"); 
    die();
}

Таким образом, другие php файлы будут доступны только через require/include, а не через URL.

Ответ 2

Вы уверены, что хотите это сделать? Даже css и js файлы и изображения и...?

ОК, сначала проверьте, установлен ли mod_access в apache, а затем добавьте следующее к вашему .htaccess:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

<Files /index.php>
    Order Allow,Deny
    Allow from all
</Files>

Первая директива запрещает доступ к любым файлам, кроме как из localhost, из-за Order Deny,Allow, Allow получает применение позже, вторая директива влияет только на index.php.

Предостережение: нет пробела после запятой в строке заказа.

Чтобы разрешить доступ к файлам, соответствующим *.css или *.js, используйте эту директиву:

<FilesMatch ".*\.(css|js)$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

Вы не можете использовать директивы для <Location> или <Directory> внутри файлов .htaccess.

Ваш вариант будет состоять в том, чтобы использовать <FilesMatch ".*\.php$"> вокруг первой группы allow, deny и затем явно разрешить доступ к index.php.

Обновление для Apache 2.4: Этот ответ правильный для Apache 2.2. В Apache 2.4 была изменена парадигма управления доступом и правильный синтаксис заключается в использовании Require all denied.

Ответ 3

Собственно, я пришел сюда с тем же вопросом, что и создатель темы, но ни одно из решений не было полным ответом на мою проблему. Зачем добавлять код ко всем файлам на вашем сервере, когда вы могли бы просто настроить его один раз? Самый близкий был Residuum one, но все же он исключил ВСЕ файлы, когда я хотел исключить только файлы php, которые не были названы index.php.

Итак, я придумал .htaccess, содержащий это:

<Files *.php>
    Order Deny,Allow
    Deny from all
    Allow from 127.0.0.1
</Files>

<Files index.php>
    Order Allow,Deny
    Allow from all
</Files>

(Помните, что файлы htaccess работают рекурсивно, поэтому он идеально подходит для предпосылки вопроса.)

И вот мы идем. Единственными файлами php, которые будут доступны для пользователя, будут те, которые называются index.php. Но вы все равно можете получить доступ к каждому изображению, стилю CSS, js script и т.д.

Ответ 4

Наклонный ответ на вопрос состоит в том, чтобы написать весь код как классы, кроме файлов index.php, которые являются тогда единственными точками входа. Файлы PHP, содержащие классы, не приведут к чему-либо, даже если они вызываются непосредственно через Apache.

Прямым ответом является включение следующего в .htaccess:

<FilesMatch "\.php$">
    Order Allow,Deny
    Deny from all
</FilesMatch>
<FilesMatch "index[0-9]?\.php$">
    Order Allow,Deny
    Allow from all
</FilesMatch>

Это позволит использовать любой файл, такой как index.php, index2.php и т.д., но откажется от доступа любого вида к другим .php файлам. Это не повлияет на другие типы файлов.

Ответ 5

Вы можете попробовать определить константу в index.php и добавить что-то вроде

if (!defined("YOUR_CONSTANT")) die('No direct access');

в начало других файлов.

ИЛИ, вы можете использовать mod_rewrite и перенаправлять запросы на index.php, редактируя .htaccess следующим образом:

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php/$1 [L,R=301]

Затем вы должны иметь возможность анализировать все входящие запросы в index.php и принимать соответствующие действия.

Если вы хотите, например, оставить все файлы *.jpg, *.gif, *.css и *.png, вы должны отредактировать вторую строку следующим образом:

RewriteCond $1 !^(index\.php|*\.jpg|*\.gif|*\.css|*\.png)

Ответ 6

Как сохранить все .php файлы, кроме index.php над корнем веб-сайта? Нет необходимости в каких-либо правилах перезаписи или программных скинах.

Добавление папки include в ваш путь include поможет вам упростить задачу, не нужно использовать абсолютные пути и т.д.

Ответ 7

Редактирование URL-адресов можно использовать для сопоставления URL-адресов в .php файлах. Следующие правила могут определять, был ли задан запрос .php напрямую или он был переписан. Он запрещает запрос в первом случае:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^.+?\ [^?]+\.php[?\ ]
RewriteRule \.php$ - [F]
RewriteRule test index.php

Эти правила запрещают все запросы, заканчивающиеся на .php. Однако по-прежнему разрешены URL-адреса, такие как / (который запускает index.php), /test (который переписывает index.php) и /test?f=index.php (который содержит index.php в querystring).

THE_REQUEST содержит полную строку HTTP-запроса, отправленную браузером на сервер (например, GET /index.php?foo=bar HTTP/1.1)

Ответ 8

Вместо того, чтобы передавать переменную вокруг, я делаю это, что является самодостаточным в верхней части любой страницы, к которой вы не хотите прямого доступа, это все равно должно быть сопряжено с правилами .htaccess, но я чувствую себя более уверенно, зная, что есть сбой -safe, если htaccess когда-либо запутывается.

<?php
// Security check: Deny direct file access; must be loaded through index
if (count(get_included_files()) == 1) {
    header("Location: index.php"); // Send to index
    die("403"); // Must include to stop PHP from continuing
}
?>

Ответ 9

Простое решение - переименовать все файлы non-index.php в .inc, а затем запретить доступ к файлам *.inc. Я использую это во многих своих проектах, и он отлично работает.

Ответ 10

поместите все файлы в одну папку. поместите файл .htaccess в эту папку и дайте ему значение deny all. то в index.php, который помещен за пределы папки, он выводит правильные страницы на основе пользовательского ввода или события

Ответ 11

С Apache 2.4 синтаксис управления доступом изменился. Если вы используете такие директивы, как:

Order deny,allow
Deny from all

не работает, вы, вероятно, используете Apache 2.4.

Документы Apache 2.4 здесь.

Вам нужно использовать Require all denied одним из следующих способов:

# you can do it this way (with "not match")

<FilesMatch ^((?!index\.php).)*$>
  Require all denied
</FilesMatch>

# or 

Require all denied

<Files index.php>
  Require all granted
</Files>

Ответ 12

Разрешить только 2 ip, все остальные блокируют

Order Deny,Allow
Deny from all
Allow from 173.11.227.73 108.222.245.179

Ответ 13

<Files ~ "^.*\.([Pp][Hh][Pp])">
 Order allow,deny
 Deny from all
 Satisfy All
</Files>