TYPO3 Как избежать манипулирования объектным идентификатором формы? - PullRequest
0 голосов
/ 29 января 2020

Я бы хотел избежать манипуляции со скрытым полем (__identify) в форме. Например, форма edit. Если кто-то идет к инспектору и меняет значение на другое uid, то действие update фактически обновляет измененное значение вместо исходного.

Manipulation

Теперь, если кто-то изменит это на 8, действие обновления обновит объект с помощью идентификатора пользователя 8.

Is Есть ли способ избежать таких действий?

  • TYPO3: v9
  • Режим: Composer Режим

С уважением

1 Ответ

1 голос
/ 29 января 2020

Спасибо @Daniel Siepmann (typo3.slack.com) за то, что указал мне правильное направление. Поэтому ответ прост и легко реализуем.

TYPO3 использует hmac для внутренних целей и имеет функцию stati c, называемую hmac в классе GeneralUtility.

Концепция:

Мы создаем скрытое поле в форме со строкой hma c на основе идентификатора объекта и слова по вашему выбору. (Чтобы сделать расшифровку более сложной для злоумышленника). Затем на контроллере мы восстанавливаем hma c с помощью uid, который был передан через аргументы формы контроллеру и словом, которое мы ранее определили. Если они совпадают, то объект может быть обновлен. Если нет, то мы перенаправляем пользователя на другую страницу (ошибка или просмотр списка, решать только вам).

Как его использовать:

your_extension / Classes / Controller / YourController. php

public function editAction(Object $object)
{
   $hmac = GeneralUtility::hmac($object->getUid(), 'yourWord');
   $this->view->assign('hmac', $hmac);
   $this->view->assign('object', $object);
}

Здесь мы генерируем hmac на основе идентификатора объекта и слова, которое вы можете указать самостоятельно. Затем мы передаем его в FrontEnd, чтобы добавить его в скрытое поле, а затем сравнить его.

ОЧЕНЬ ВАЖНО: Я бы настоятельно рекомендовал использовать слово. Он должен быть одинаковым везде, где вы его используете. Для меня сейчас это слово yourWord.

your_extension / Resources / Private / Templates / Edit. html

<f:form action="update" name="object" object="{object}" extensionName="ExtensionName" pageUid="{settings.flexform.pages.update.pid}" enctype="multipart/form-data">
    <f:form.hidden name="hmac" value="{hmac}" />
    {...}
</f:form>

Здесь мы определяем скрытое поле со значением hma c. Мы собираемся сравнить его в контроллере.

your_extension / Classes / Controller / YourController. php

public function initializeUpdateAction() {
   $args = $this->request->getArguments();

   /*Check if the user has not deleted the hmac hidden field*/
   if ($args['hmac']) {

      /*Regenerate the hmac to compare it with the one from the $args variable*/
       $hmac = GeneralUtility::hmac($args['object']['__identity'], 'yourWord');

       if ($hmac !== $args['hmac']) {
             $this->redirect('list', 'ControllerName', 'ExtensionName', null, $this->settings['global']['error']['pid']);
        }
   }
   else {
      $this->redirect('list', 'ControllerName', 'ExtensionName', null, $this->settings['global']['error']['pid']);
   }
}

Здесь мы Сначала оцените, существует ли hmac. Пользователь мог удалить скрытое поле, чтобы избежать сравнения. Если TYPO3 не находит hmac в переданных аргументах ($args['hmac']), он перенаправит пользователя на указанную страницу, и объект не будет обновлен.

Если TYPO3 находит hmac, то генерируется еще один hmac с данным uid ($args['object']['__identity']) и словом, которое вы сгенерировали предыдущим hmac. Если он не совпадает, это означает, что пользователь манипулировал идентификатором пользователя. Затем TYPO3 перенаправляет пользователя на указанную страницу, и объект не будет обновлен.

Все это можно написать более элегантно, но ради этого ответа я попытался сделать его коротким.

С наилучшими пожеланиями

...