Я пытаюсь предотвратить прямой доступ к определенному файлу в подпапке.
Я понимаю, что здесь, на этом форуме, есть МНОГО тем. Но мой, кажется, немного неловко …….. из-за моего уже существующего файла 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», но это все еще отображается в адресной строке.
Я пробовал много способов скрыть имя файла, но, похоже, ничего не работает
ИМХО, разрешение доступа к файлу 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.
Других решений пока нет …