Спасибо @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 перенаправляет пользователя на указанную страницу, и объект не будет обновлен.
Все это можно написать более элегантно, но ради этого ответа я попытался сделать его коротким.
С наилучшими пожеланиями