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


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

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

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

обновление:

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

обновление 2:

The index.php в папка www.myadress.com/myfolder/index.php

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

13 71

13 ответов:

в индекс.php, добавьте значение доступа следующим образом:

$access = 'my_value';

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

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

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

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

OK, сначала проверьте, установлен ли 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, разрешить применяется позже, вторая директива влияет только на индекс.РНР.

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

разрешить доступ к сопоставление файлов *.css или *.js используйте эту директиву:

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

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

ваш вариант будет использовать <FilesMatch ".*\.php$"> вокруг первого разрешить, запретить группу, а затем явно разрешить доступ к индексу.РНР.

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

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

вот я и придумал .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.РНР. Но вы все равно можете получить доступ к каждому изображению, таблице стилей css, сценарию js и т. д.

косой ответ на вопрос заключается в том, чтобы написать весь код в виде классов, кроме индекса.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>

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

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

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

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

или, вы можете использовать mod_rewrite и перенаправлять запросы на индексацию.php, редактирование .htaccess такой:

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

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

если вы хотите оставить все *.формат JPG.* ,файл GIF.* ,css и *.PNG файлы, например, то вы должны изменить вторая строка выглядит так:

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

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

добавление папки includes-в ваш путь включения поможет сохранить вещи простыми, не нужно использовать абсолютные пути и т. д.

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

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

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

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

вместо того, чтобы передавать переменную вокруг я делаю это, который является автономного в верхней части любой страницы, к которой вы не хотите прямого доступа, это все равно должно быть сопряжено .правила htaccess, но я чувствую себя безопаснее, зная, что есть отказоустойчивость, если 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
}
?>

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

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

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

Order deny,allow
Deny from all

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

The Apache 2.4 docs здесь.

вы должны использовать 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>

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

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