Вопрос или проблема
Запретить пользователям доступ к странице подтверждения отправки формы, если они не попали туда через форму.
У меня есть веб-форма, которая позволяет пользователям отправлять свои данные.
Примечание: данные не хранятся на сервере, а отправляются на электронный адрес.
Когда пользователь нажимает кнопку ‘Отправить’, обработчик формы перенаправляет пользователя на страницу ‘Подтверждение отправки’, которая гласит… “Спасибо за отправку вашей формы.”
header(‘location: /sentconfirmation.php’);
Проблема в том, что пользователь может просто ввести: (пример) mywebsite.com/sentconfirmation.php в свой браузер и сделать скриншот, чтобы заявить, что он отправил свою форму, когда на самом деле этого не произошло.
Можно ли как-то предотвратить доступ пользователя к странице подтверждения отправки напрямую и сделать так, чтобы он мог попасть туда только после фактической отправки формы?
Или, может быть, существует способ замаскировать URL-адрес страницы подтверждения отправки?
Да, это возможно. В этом случае я, скорее всего, воспользуюсь функцией сессий PHP.
Вы можете хранить статус отправки формы в сессии и на основе этого разрешать пользователям доступ к этой странице или блокировать его.
Вот как бы я это сделал:
Убедитесь, что обе ваши страницы могут использовать функцию сессий PHP, добавив следующую строку в верхнюю часть обеих страниц:
<?php
session_start();
Перед заголовком перенаправления добавьте следующую строку:
<?php
$_SESSION['form_submitted'] = true;
header('location: /sentconfirmation.php');
Вы можете проверить это значение на странице перенаправления.
<?php
session_start();
if (!isset($_SESSION['form_submitted']) || $_SESSION['form_submitted'] !== true) {
// Перенаправить на страницу формы, если переменная сессии не установлена
header('Location: /index.php');
exit;
}
// Удаление переменной сессии, чтобы предотвратить обновление страницы и повторный просмотр
unset($_SESSION['form_submitted']);
// Отображение вашего сообщения о подтверждении
echo "Спасибо за отправку вашей формы.";
Надеюсь, это поможет.
Ответ или решение
Да, предотвратить доступ пользователей к странице подтверждения отправки формы можно, реализовав проверку на стороне сервера с помощью сессий в PHP. Это будет гарантировать, что только пользователи, действительно отправившие форму, смогут увидеть страницу подтверждения.
Вот общий подход к решению вашей проблемы:
-
Используйте сессии: Убедитесь, что на обеих страницах включены сессии, добавив
session_start()
в начале файлов. Это необходимо для сохранения состояния между запросами. -
Установка флага отправки формы: Перед тем как перенаправить пользователя на страницу подтверждения, установите в сессии переменную, указывающую, что форма была отправлена.
-
Проверка переменной сессии на странице подтверждения: На странице подтверждения проверьте значение сессионной переменной. Если она не установлена или не имеет ожидаемого значения, перенаправьте пользователя обратно на форму.
- Сброс флага после проверки: После того как пользователь посетит страницу подтверждения, сбросьте значение сессионной переменной, чтобы предотвратить повторный доступ к странице подтверждения при обновлении.
Вот пример кода для реализации этой логики:
На странице обработки формы (например, process_form.php
):
<?php
session_start();
// Здесь выполняйте проверку и обработку данных формы
// После успешной обработки формы
$_SESSION['form_submitted'] = true;
header('Location: /sentconfirmation.php');
exit;
?>
На странице подтверждения (например, sentconfirmation.php
):
<?php
session_start();
// Проверяем, была ли форма отправлена
if (!isset($_SESSION['form_submitted']) || $_SESSION['form_submitted'] !== true) {
// Если форма не была отправлена, перенаправляем обратно на страницу с формой
header('Location: /index.php');
exit;
}
// Удаляем переменную сессии, чтобы предотвратить повторный доступ
unset($_SESSION['form_submitted']);
// Отображаем сообщение о подтверждении
echo "Спасибо за отправку вашей формы.";
?>
Этот подход позволяет вам контролировать доступ к странице подтверждения и предотвращает возможность доступа к ней напрямую через URL. Пользователь должен пройти через форму, чтобы увидеть страницу подтверждения, тем самым минимизируя возможность злоупотреблений.
Надеюсь, это поможет вам решить вашу проблему!