2017-02-20 4 views
0

realurl сохраняет в таблице tx_realurl_urldata ссылки без cHash. Это делает возможным DB-затопление, если хакер добавляет некоторые GET-параметр в URL:Почему realurl сохраняет ссылки без cHash?

L=1&id=14&tx_gbaccount_transactions[@widget_0][currentPage]=3&foo=bar L=1&id=14&tx_gbaccount_transactions[@widget_0][currentPage]=3&asd=123 и т.д.

Есть ли решение этой проблемы? Могу я сказать realurl, не сохраняйте определенные ссылки?

Спасибо-х

+0

Вы нашли решение вашей проблемы? –

+0

Я бы сказал, да и нет. Прочтите мои комментарии об этом, пожалуйста. Разработчик realurl Дмитрий Дулепов сказал мне, что realurl способен контролировать, насколько велик БД и безопасен от наводнения. – olek07

ответ

2

Вы можете исключить определенные параметры из кэширования.

Ссылка на руководство для 2.x: https://github.com/dmitryd/typo3-realurl/wiki/Notes-for-Developers#banning-certain-urls-from-realurl-cache

Обратите внимание, что существует проблема в ядре TYPO3 до сентября 2016 года, которое было зафиксировано: https://typo3.org/teams/security/security-bulletins/typo3-core/typo3-core-sa-2016-022/

Насколько я испытал нет никакого способа, чтобы затопить кеш realurl путем добавления случайных параметров. В случае, если вы нашли способ, создайте отчет об ошибке в проекте Dmitrys github: https://github.com/dmitryd/typo3-realurl

0

Вложения кэша realurl записываются только при создании ссылок с использованием функции типологии TYPO3. Они не создаются на основе внешних запросов. Таким образом, единственный способ затопить этот кеш - это сделать сам скрипт.

Элементы кэша могут содержать cHash или могут быть без него в зависимости от параметров typolink, заданных для создания ссылки. Таким образом, вы можете явно отключить использование кэша, сообщив typolink не использовать его, установив useCacheHash = FALSE.

Это фактически сделано большинством плагинов и методов API плагинов в случае, если кеширование отключено глобально или ссылки создаются в контексте объекта USER_INT, где кеширование отключено только для этого контекста. В этом случае кэширование не ожидается, поэтому cHash не требуется вообще.

0

Я думаю, виджеты для разбивки на страницы написаны не совсем правильно. пагинацию виджет использует виджет LinkViewHelper, который имеет метод getWidgetUri

protected function getWidgetUri() 
{ 
    $uriBuilder = $this->controllerContext->getUriBuilder(); 
    $argumentPrefix = $this->controllerContext->getRequest()->getArgumentPrefix(); 
    $arguments = $this->hasArgument('arguments') ? $this->arguments['arguments'] : []; 
    if ($this->hasArgument('action')) { 
     $arguments['action'] = $this->arguments['action']; 
    } 
    if ($this->hasArgument('format') && $this->arguments['format'] !== '') { 
     $arguments['format'] = $this->arguments['format']; 
    } 
    return $uriBuilder->reset() 
     ->setArguments([$argumentPrefix => $arguments]) 
     ->setSection($this->arguments['section']) 
     ->setAddQueryString(true) 
     ->setAddQueryStringMethod($this->arguments['addQueryStringMethod']) 
     ->setArgumentsToBeExcludedFromQueryString([$argumentPrefix, 'cHash']) 
     ->setFormat($this->arguments['format']) 
     ->build(); 
} 

setAddQueryString (правда) говорит, чтобы добавить все GET-параметр для каждого постраничной URL И это не представляется возможным установить addQueryString ложь, или сказать , что необходимо добавить только определенные параметры. В моем случае, это StartDate и ENDDATE

Я решил эту проблему с помощью XCLASS и getWidgetUri выглядит следующим образом:

protected function getWidgetUri() 
{ 
    $uriBuilder = $this->controllerContext->getUriBuilder(); 
    $argumentPrefix = $this->controllerContext->getRequest()->getArgumentPrefix(); 
    $arguments = $this->hasArgument('arguments') ? $this->arguments['arguments'] : []; 
    if ($this->hasArgument('action')) { 
     $arguments['action'] = $this->arguments['action']; 
    } 
    if ($this->hasArgument('format') && $this->arguments['format'] !== '') { 
     $arguments['format'] = $this->arguments['format']; 
    } 


    $startdate = GeneralUtility::_GET('startdate'); 
    $enddate = GeneralUtility::_GET('enddate'); 

    $allowedParams = array(); 

    if ($startdate != NULL) { 
     $allowedParams['startdate'] = $startdate; 
    } 

    if ($enddate != NULL) { 
     $allowedParams['enddate'] = $enddate; 
    } 

    return $uriBuilder->reset() 
     ->setArguments([$argumentPrefix => $arguments, $allowedParams]) 
     ->setSection($this->arguments['section']) 
     ->setAddQueryString(false) 
     ->setAddQueryStringMethod($this->arguments['addQueryStringMethod']) 
     ->setArgumentsToBeExcludedFromQueryString([$argumentPrefix, 'cHash', 'type']) 
     ->setFormat($this->arguments['format']) 
     ->setUseCacheHash(false) 
     ->build(); 
} 
Смежные вопросы