Отредактируйте файл HTACCESS, чтобы предотвратить прямой доступ к определенному файлу в определенной папке

Я пытаюсь предотвратить прямой доступ к определенному файлу в подпапке.

Я понимаю, что здесь, на этом форуме, есть МНОГО тем. Но мой, кажется, немного неловко …….. из-за моего уже существующего файла HTACCESS.

Вот путь к файлу:

www.example.com/PRINCIPAL/PROJECTS/my_file.php

(my_file.php это файл, который я хочу ограничить от прямого доступа)

Я имею в виду следующее: my_file.php доступен в текущий момент, только если пользователь перемещается по определенной последовательности событий на моем веб-сайте (например, выберите переключатель здесь …….. нажмите другую кнопку там и т. Д., И т. Д. )

Я хочу, чтобы так и оставалось.

К сожалению, если пользователь пытается получить доступ к файлу напрямую, введя URL в своем браузере, он также может получить доступ к my_file.php

Что то, чего я не хочу.

Причина, по которой я говорю, что моя ситуация довольно неловкая, заключается в том, что: обычно это легко исправить:

(a) включить в файл HTACCESS правило, которое препятствует прямому доступу к самому файлу
(б) поместите файл в отдельную папку, а затем просто используйте DENY ALL в файле htaccess
(c) поместите файл в отдельную папку, а затем создайте файл EMPTY INDEX, прямо рядом с ним

И так далее

Причина, по которой ни один из них не будет работать для меня — это, как я уже говорил, из-за моего текущего файла HTACCESS. Он уже содержит два правила:

(a) правило для удаления всех расширений файлов PHP
(б) правило, чтобы скрыть подпапку «ПРОЕКТЫ» из вида (в панели браузера)

Вот мой текущий файл HTACCESS:

 Options -Indexes
Options -MultiViews
Options +FollowSymlinks

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/?([^/]+)/([^/]+)/([^.]+)\.php [NC]
RewriteRule ^ /%1/%3 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/?$ $1/PROJECTS/$2.php [NC,L]

</IfModule>

Итак, как я упоминал ранее, это путь к my_file.php:

www.example.com/PRINCIPAL/PROJECTS/my_file.php

С этими двумя правилами в моем файле HTACCESS фактический путь к файлу становится:

www.example.com/PRINCIPAL/my_file

Из-за этого те 3 решения, которые я перечислил выше — A, B и C — не будут работать для меня.

Я не могу найти в Интернете ничего, что решает мою конкретную проблему. Я все еще новичок в этом, но я предполагаю, что мне нужно будет:

(а) каким-то образом изменить мой текущий файл HTACCESS
(б) создайте новый и отдельный файл HTACCESS и поместите его в отдельную папку вместе с my_file.php

Любая помощь здесь будет принята с благодарностью

Спасибо

ОБНОВИТЬ

Я должен был упомянуть: «my_file.php» открывается в новом окне (ребенок-окно). Я уже решил проблему с помощью Переменные $ _SESSION проверить, сделал ли пользователь конкретный необходимый выбор. К сожалению, это не сработало. Когда я проверил журналы ошибок, я увидел это сообщение: НЕОПРЕДЕЛЕННЫЙ ИНДЕКС XXXXX.

По-видимому, когда дочернее окно открыто, переменная сеанса не переносится (что странно)

ОБНОВИТЬ

Вот код с родительской страницы:

  if(isset($_POST['submit'])  {

$_SESSION['response'] = $_POST['selection'];

(Пользователь должен выбрать переключатель, чтобы продолжить).

Затем в верхней части дочернего окна у меня есть этот код:

if (!(isset($_SESSION['login']) && $_SESSION['login'] != '') ||
(isset($_SESSION['login']) && !(isset($_SESSION['response']))

{

header ("Location: /PROJECTS/access_denied");

Первая часть проверяет, чтобы убедиться, что пользователь вошел в систему.

Вторая проверка, чтобы убедиться, что переключатель действительно был выбран на предыдущей странице.

ОБНОВИТЬ

Еще раз, кое-что, что я должен был упомянуть: (моя голова сейчас повсюду). Детское окно — это программа для анкетирования; он задает ряд вопросов, по одному за раз. Каждый раз, когда задается новый вопрос, окно обновляется. И это тот же файл php (my_file.php). Он обновляется каждый раз, но отображает новый вопрос, в зависимости от того, что пользователь выбирает на каждой предыдущей странице.

По этой причине $ _SESSION «проверятьmsgstr «должен быть действительным, каждый раз, когда обновляется дочернее окно.

Если я UN-SET сеанс в начале первого дочернего окна, следующий вопрос отобразит страницу «Access_Denied»!

И вы можете спросить: зачем открывать эту анкету в окне ребенка? Ну, среди прочих причин я отключил «кнопку« Назад »и« обновление страницы »в этом дочернем окне, потому что важно, чтобы пользователь не обновлял это окно после того, как анкета началась.

РЕДАКТИРОВАТЬ

В крайнем случае, я полагаю, я мог бы просто СКРЫТЬ имя файла (my_file) из адресной строки URL, так что пользователь не знает имя файла и, следовательно, не будет знать, как его искать.

Я попытался изменить имя файла на «index.php», но это все еще отображается в адресной строке.

Я пробовал много способов скрыть имя файла, но, похоже, ничего не работает

0

Решение

ИМХО, разрешение доступа к файлу PHP только в том случае, если пользователь идет определенным путем, не является правильным подходом. Файл на веб-сервере всегда должен быть общедоступным или нет (и иногда нет, иногда нет).

Мое предложение будет собирать информацию о том, как пользователь взял. Вы можете, например, сохранить эти данные в сеансе, а затем проанализировать их, когда ваш my_file.php называется. Если вы заметили, что пользователь до сих пор избрал «правильный» путь, вы можете выполнить свой скрипт как обычно. Если нет, вы должны отобразить сообщение об ошибке или — если хотите — сказать ему, что у него нет доступа.

Предполагая, что вы хотите использовать сеанс для этой цели, вы можете поместить следующий код поверх вашего my_file.php:

session_start();
if (!isset($_SESSION['login']) || ($_SESSION['login'] == '') ||
!isset($_SESSION['response']))
{
header ("Location: /PROJECTS/access_denied");
exit;
}

//Process the request, as the user is now confirmed to be allowed to use this page

//In the end, possibly:
unset($_SESSION['response']);
//Now the user won't be able to use this page again until he "took the right way" again.

На вашей родительской странице вы должны использовать:

session_start();
if(isset($_POST['submit'])  {
$_SESSION['response'] = filter_input(INPUT_POST,'selection');
//...
}

// I assume, that $_SESSION['login'] is set somewhere else.

Это просто очень простой пример. Я думаю, что ключ собирает информацию о том, как пользователь получил доступ к вашему сценарию.

Когда сеансы не используются, можно подумать о проверке $_SERVER['HTTP_REFERER'] чтобы проверить, откуда пришел пользователь, но вы должны иметь в виду, что многие пользователи не отправляют эту информацию из соображений конфиденциальности и даже больше, что для реферера может быть установлено произвольное значение клиентом, так что это определенно не правильный путь.

Редактировать: вставленный код для использования сеанса, как в вашем примере. Вы не забыли позвонить session_start() на обеих страницах? я думаю if Заявление в начале было немного запутано, поэтому я постарался сделать по проще. 🙂 Также я использовал filter_input как базовое улучшение безопасности при чтении переменной POST.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]