@spido

Как запретить работу функции за пределами страницы с формой?

Приветствую!

Движок сайта построен по MVC.

Есть страница сайта, на которой есть форма регистрации.
Адрес страницы registration.html формируется из контроллера Login.php, функция страницы registration().
public function registration() {  
        return View::fetch($this->template_dir . 'registration');
    }

Получается адрес страницы регистрации
https://site.ru/Login/registration.html

На странице https://site.ru/Login/registration.html есть форма регистрации, которая обрабатывается другим контроллером: Connectemail.php, функция send_mail().
В функцию send_mail() передаются параметры формы и форма отрабатывает.
<form method="post" action="/Connectemail/send_mail">
<input type="text" name="user_email"  />
<input type="text" name="user_name"  />
</form>

Так же функцию формы можно запустить отдельно
https://site.ru/Connectemail/send_mail.html?user_name=vaska&user_email=main-email@narod.ru


Вопрос: как запретить ссылке
https://site.ru/Connectemail/send_mail.html?user_name=vaska&user_email=main-email@narod.ru

отрабатывать самостоятельно, за пределами страницы с формой, которая находится по адресу
https://site.ru/Login/registration.html?

Допустим в контроллере Connectemail.php функция send_mail()
я определяю контроллер и разрешаю работу функции только на странице контроллера Login.php
public function send_mail() {
      //разрешаю работу функции только на странице контроллера Login.php
       $controller=request()->controller();
       if ($controller != 'Login') {
         echo lang('Системная ошибка');
         exit;
       }
      // бла-бла, код функции
}

Но тогда функция перестаёт работать везде.

Далее пробовал сделать так:
В контроллере Connectemail.php, функция send_mail() разрешаю работу функции только на странице контроллера Login.php в котором я указал define("LOGIN_VERIFY_MODE", true);
public function send_mail() {
      //разрешаю работу функции только на странице контроллера Login.php у которого я указал define("LOGIN_VERIFY_MODE", true);
       if (!defined("LOGIN_VERIFY_MODE")) {
            header("HTTP/1.1 404 Not Found");
            echo "Not Found";
            exit(1);
        }
      // бла-бла, код функции
}

Но функция send_mail(), в контроллере Connectemail.php не видит в контроллере Login.php прописанный define("LOGIN_VERIFY_MODE", true);.

Что я делаю не так?
Заранее спасибо за ваш отклик.
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Перед тем как строить движки сайтов по MVC, надо сначала прочитать букварь по веб-разработке.
И узнать из него, что
- РНР запускается на сервере. А все формы отображаются в браузере у пользователя.
- РНР запускается заново на каждый запрос.
- на странице с формой никаких функций РНР нет. РНР со всеми своими функциями остался на сервере
- РНР знать ничего не знает ни про какие страницы. Он видит только НТТР запросы. Который приходят не "со страниц", а от НТТР клиента. Который может быть браузером, а может быть какой угодно другой программой. Но даже если и браузер, то опять же, запрос приходит не "со страницы". А из НТТР клиента. В теории, клиент может сообщить серверу, какую страницу он запрашивал перед этим, но как правильно сказано в соседнем ответе, эту информацию легко подделать.
- все значения констант, установленные про вызове одного скрипта, тоже остались на сервере, и если после этого обратиться к совсем другому скрипту, то он знать ничего не знает про то что делал первый.

И уже самостоятельно сделать из этой информации вывод о том, что
Запретить "ссылке отрабатывать самостоятельно, за пределами страницы с формой" невозможно.

И здесь мы переходим к следующему вопросу.
Почему вдруг роботы со всего мира вдруг с цепи сорвались и пытаются заргистрироваться на сайте?
А потому что почему-то вместо регистрации скрипт называется send_mail.
А боты очень любят писать письма. И как только находят скрипт, который отправляет почту, тут же начинают его дергать, как теленок - мамкину сиську.

Для того, чтобы они перестали, достаточно просто назвать вещи своими именами. И со страницы регистрации отправлять клиента не на скрипт, который отправляет почту, а на скрипт, который занимается регистрацией.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы