![]() |
Что происходит в ядре, когда идет запрос битых адресов...
Добрый вечер...
Вопрос про разработку расширений и ссылки к ним... Допустим у нас есть некое расширение, которое создает ссылки: С самым простым примером постраничный листер tx_myext_pi1[page] = 5 или даже index.php?id=342343 (где id= значению не существующей страницы). И здесь получается, что параметр 5 - может быть любым - пользователь взял и от бума ввел 8484 - естественно такой страницы не существует... Как себя в таком случае ведет именно ядро системы... Ведь по идее мы не должны к данному _GET-запросу создавать кэш страницы... Как этот вопрос решается. Т.е. вопрос о битых URL-значениях? И если ситуация такая - что допустим мы отправили - 404-ошибку... Т.е. получается что у нас при каждом запросе не существующей страницы каждый раз создается уникальная 404-страница - которая по идее еще и кэш будет создавать при каждом новом не верном значении № страниы.... Или так понимаю, что к каждой подобной ссылке: tx_myext_pi1[page] = 5 - я добавляю "useCacheHash" - и нет проблем? Просто не совсем пойму, даже если я добавил этот useCacheHash = true и пользвователь запросил не существующую страницу tx_myext_pi1[page] = 5432... то получается по данному битому адресу у нас все равно будет сгенерированна новая страница - но без записи кэша в БД - правильно ли понимаю? и useCacheHash = true к каждой подобной ссылке - решит все проблемы и мое беспокойство по этому вопросу напрасно... Просто - что если какой нибудь, назовем его нехорошим человеком, решит запарсить (загрузить что бы повесить) мой сайт битыми ссылками... Ведь движок же каждую из них будет обрабатывать... И мне главное что бы ничего лишнего не писалось ко мне... И что бы в случае таких атак сайт не провис... Вот пример битой ссылки: http://typo3.org/fewfewfewfwefew/fwefewfewfwefwe Это я сделал 1 - запрос по данному адресу... А с помощью программ я могу делать таких запросов 1000 в минуту с разными комбинациями... И если у меня будет в БД что-то лишнее писаться, то БД многократно будет увеличиваться... И человек поставивший цель завалить мой сайт - с ней успешно справиться. -- Спасибо. |
И вот еще вопрос то про "useCacheHash".
useCacheHash у нас получится только в том, случае если пользователь ходит по сайту... А вот если он сделает прямое обращение к странице... /about/page-1/ ? к примеру - то это как будет выглядеть - где здесь useCacheHash? хотя если бы он (пользователь) ходил по ссылкам на сайте - то у него было бы useCacheHash в ссылках. |
Там и не понял как хэш к ссылкам добавляется...
Когда делается прямой заход... |
Хэш добавляется только при генерации ссылки ядром. В случае RealURL хэша не видно, но он есть. Просто сохраняется в отдельной таблице url+хэш и убирается из выводимого на страницу url.
По остальным вопросам логика такая. Если вы запрашиваете несуществующий id страницы, то вам вернется ответ 404 и ничего ни в какие кэши не сохраниться. Если вы запрашиваете страницу с параметром page/?tx_myext_pi1[page] = 352326 то тут происходит следующее.
То есть проблему "завалить сайт через кэш" создатели TYPO3 решили давно и успешно через механизм cHash. Поэтому не устаревающая классика вам в помощь: http://typo3.org/documentation/artic...ies-of-chash-1 |
Цитата:
|
Но проблема пока осталась.
Мне надо как-то получить уникальное значение правильной страницы (т.е. той которая без 404-ошибок) и имеет кэш/хеш... Два сценария: 1) обычная страница (id) 2) обычная страница (id) + наш работающий плагин - создающий ссылки с useCacheHash Если есть правильный ключ (для сценария 1/2) - то, я выполняю определенное действие, если нет - значит не выполняю... Просто почему я его еще (cHash) - не могу брать из URL и делать действия по нему...: к примеру: adressen.html?tx_ttnews[sorting]=tx_lonewsadress_zip&tx_ttnews[direction]=dec&cHash=d4c3d91f14 Так это потому, что я могу поменять сам cHash - в данном адресе... И мне нужно как-то проверить, правильный (т.е. существующий) - ли cHash передан? В общем - как можно проверить - создался ли кэш в сценарии 1 или в сценарии 2? |
В общем суть проблемы...
Значение я сгенерировал из трех параметров: ID.страницы | Тип страницы | и cHash Но проблема с realurl вот в следующем: PHP код:
При первом заходе мы имеем cHash... А при повторном заходе - cHash - уже прячится.... Соответственно имеем уже другое значение. |
Что-то я не пойму о чем вы толкуете - проверять cHash вручную... Зачем?
Может опишите задачу которую хотите решить более обще? |
В общем тогда суть задачи опишу...
Проблема №1. И кстати - посмотрел (попробовал) сделать битые адреса на сайте который работает на typo3. Беру от "туды не сюды": http://site-name/weffwefwe/fwefwe/fwefwefwe/fwefwefwe-1 http://site-name/weffwefwe/fwefwe/fwefwefwe/fwefwefwe-2 http://site-name/weffwefwe/fwefwe/fwefwefwe/fwefwefwe-3 http://site-name/weffwefwe/fwefwe/fwefwefwe/fwefwefwe-4 http://site-name/weffwefwe/fwefwe/fwefwefwe/fwefwefwe-.... http://site-name/weffwefwe/fwefwe/fw...fwefwe-1000032 И так далее - и что интересно ... вся эта лабуда будет находить свое отражение в двух таблицах (хотя адреса битые - и по ним идет 404-ошибка!: sys_log (если конечно не отключено ведение логов в localconf - хотя у меня не получалось на 100%-их ведение отключить - отключаешь - все равно что-то пишется... tx_realurl_chashcache (если на сайте установлено расширение realurl) Причем не важно - правильный или бытый адресе... Все равно в tx_realurl_chashcache - будут писаться строки: 0185ffa2f1afa6f2ef1f22d1f4826305 468f8782df5c94cb79eb2dd5642490dc А соответственно - значит что если сделать много битых адресов - то размеры этих таблиц будут постоянно расти - и "убивать" сайт. Суть задачи в том, что нужно как-то сохранять кэш для smarty.... Но сейчас то, как есть - получается если запросить вариант битого адреса http://site-name/weffwefwe/fwefwe/fw...fwefwe-1000032 то кэш будет сохраняться и по нему... а это го не нужно.... Т.е. примерно так: PHP код:
Нашел как вариант - составлять список разрешенных к сохранению в кэш страниц... А кэш будем ($cache_id) - сохранять по: "имени сайта . запрошенного адреса . № элемента на странице..." И при запросе страницы - второй раз - если она попала в список разрешенных будем разрешать сохранение элементов на ней в кэш... А если была 404-ошибка . то страница не попадает в список разрешенных страниц.... И тогда, что бы все верно работало - нужно что бы везде стояли 404-ошибки... Т.к. по ним будет определяться - разрешено заносить страницу в кэш или нет (вернее объекты, которые на ней есть)... Думаю - что вполне подойдет для проектов до 1 000 страниц. Здесь вопрос в том, что 404- ошибку приходиться устанавливать, как для страницы (причем эти процессы автоматизированны) - а вот с плагинами - 404-ошибку приходиться устанавливать в ручную - в зависимости от логики, которая там применяться... |
В общем 2-проблема в том, что у меня:
cHash - скрывается realurl... Первый раз я получаю страницу с этим cHash... А потом без - т.к. он прячется и не могу понять этот механизм. Ведь URL-адрес один и тот же... А вот внутренние переменные уже другие. |
Вот еще интересная штука из API
tslib_fe :: pageNotFoundHandler("/home/", "HTTP/1.1 404 Not Found", "Segment "error-404" was not a keyword for a postVarSet as expected on page with id=2."); |
У вас есть какая-то принципиальная нестыковка, на мой взгляд.
cHash нужен ядру что бы *закэшировать* контент страницы и он появляется только в момент формирования typolink. То есть ваш контент будет кэширован ядром в составе страницы с привязкой к этому самому cHash. Зачем спрашивается внутри вашей логики что-то еще в таком случае кэшировать (и с привязкой к cHash в частности) ? Мы используем кэширование внутри плагина только в случае USER_INT. И в данном случае cHash вообще не интересен. Используем для cache_id md5() от всего, что может повлиять на контент. Это pid, type, FE группы, ряд переменных из GET, а иногда и $this->conf целиком добавляется. |
Цитата:
Проблему нашел: Есть у меня на странице LOAD_REGISTER Суть его в том, что он выбирает ключевые слова для новости... PHP код:
PHP код:
PHP код:
С удовольствием бы решил проблему следующим образом (т.к. мне не нравиться LOAD_REGISTER в принципе)... PHP код:
|
Вот полный код:
PHP код:
Извиняюсь за не точность - в данном примере ничего не пропадает... Пропадает в навигационной цепочке - при повторном посещении некэшируемой страницы... Где идет вставка значения через {register:new_title} Видимо {register} - имеет область видимости переменных... PHP код:
|
Одним словом уже запутался крепко...
Ни как не пойму - есть ли простой способ? PHP код:
Одним словом есть ли что по проще чем: PHP код:
|
Вот что получается:
Проверяю в index.php (вставляю в самый конец)... Если на странице через php-ставить no_cahe = 1 и no_set_cache() PHP код:
Если поставить в настройках TS-к странице page.config.no_cache = 1 То все значения на месте PHP код:
|
В общемь... (нет слов)...
Разобрался... Сделал просто LOAD_REGISTER - отдельно для breadcurmb... |
Осталось несколько маленьких вопросиков:
В чем раздница между этими двумя функциями (методами)? PHP код:
PHP код:
PHP код:
Думаю что теперь окончательно разобрался что из чего растет. И все равно не могу понять... Вот есть страница: эти у меня реально существуют Код HTML:
novosti/page-news/1/ novosti/page-news/4/ - все равно генриться cHash Я его даже получить могу для каждой страницы - новый уникальный... PHP код:
|
Эээ.... может быть чего то не понимаю...
Но вот заметил: установил расширение realur... вот для него есть такая настройка: PHP код:
Делаем запрос: stati/record-article/14/ (запись реально есть) stati/record-article/15/ (запись реально есть) stati/record-article/16/ (запись реально есть) stati/record-article/1222/ (ЗАПИСИ НЕТ... просто нет в БД) если сделать запрос-прямой в окне браузера: stati/record-article/1222/ - и обновить страницу... то ,будет создан: PHP код:
А $GLOBALS['TSFE']->cHash - должен создаваться только при переходе по ссылкам??? |
Что - то наверное я ошибся...:)
|
В общем последний и единственный вопрос из данной темы...
Вот если: PHP код:
А как проверить (правильно ли создан cHash) - а не через запрос от пользователя? У realurl - есть специальная таблица "tx_realurl_chashcache" - куда пишутся значения - и три выше приведенных примера cHash=5435437878787 / cHash=5435ауцацу / cHash=5fewfwefwe - он туда не пишет... А пишет только верные?... Рассчитвыал правильные значения получать через: PHP код:
В общем - как проверить - useCacheHash - создан через систему - или введен "недоброжетельным" пользователем? И никак не пойму - если realurl - не установлен - то куда тогда пишутся значения useCacheHash? И еще нашел как-получить уникальное значение шаблона сайта (id+типа+групп+mp+иCacheHash) - массива - возможно это поможет... PHP код:
|
В общем вот нашел решение проблемы:
PHP код:
Который проверяет - как то понимаю правильность запрошенного cHash... Если правлиьно - значит пишет в mysql-табличку, если нет... Ничего... Как это работает - и как сделать подобную проверку в php-коде? И вот еще одну функцию нашел: https://svn.jambage.com:8766/typo3/f...r_setfixed.php PHP код:
И так как в выше описанных примерах пока не получилось разобраться нашел такое решение - не идеальное с точки зрения разработки... PHP код:
Вот тоже - про затопление - плагинов через ввод битых cHash http://forge.typo3.org/issues/29365 --- |
RealURL и core тут не при чем. Если вам передали неправильный uid, вы вызываете $GLOBALS['TSFE']->paheNotFoundHandler('Иди на фиг, хакер поганый!') в своем расширении и все. Никаких проблем.
|
Вначале думалось проверять useCashHash - в таблицах realurl. Но после нашел - как проверить useCashHash (вернее typolink-ссылки с useCashHash=1) - оказывается через калькуляцию ссылки. Для 404-обычно использую - $GLOBALS['TSFE']->pageNotFoundAndExit();
|
Часовой пояс GMT +4, время: 17:21. |
Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot