Автор Тема: Ошибка маршрутизации в URL если подставить спец символы  (Прочитано 3513 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн Stanislav WEB

  • Завсегдатай
  • **
  • Сообщений: 47
  • Карма: 5
  • SWEB
Доброго времени суток! Использую у себя систему 2 layout для Админ панели и для сайта.
И решил попробовать, как отреагирует роутер на подстановку спец символов в URL

Например такой запрос URL http://zf.local/sign'abcde
 у меня выдал почему то ошибку

Zend
\View\Exception\RuntimeException
Zend
\View\Renderer\PhpRenderer::renderUnable to render template "layout/layout"resolver could not resolve to a file


Роутер настроен таким образом

            'sign' => array(
                
'type'    => 'Segment',
                
'options' => array(
                    
'route'    => '[/:lang]/sign[/:action]',
                    
'constraints'   => array(
                        
'controller'    => '[a-zA-Z]*',
                        
'action'        => '[a-zA-Z0-3]*',
                        
'lang'          => '(en|ru|ua)',
                    ),
                    
'defaults' => array(
                        
'controller'    => 'sign.Controller',
                        
'action'        => 'index',
                    ),
                ),
                
'may_terminate' => true,
            ),


templateMap
        'template_map' => array(
            
'siteLayout'          => __DIR__ '/../view/layout/web.phtml'// общий шаблон
            
'error/403'             => __DIR__ '/../view/error/403.phtml'// шаблон 404
            
'error/404'             => __DIR__ '/../view/error/404.phtml'// шаблон 403
            
'error/index'           => __DIR__ '/../view/error/index.phtml'// layout вывода ошибок
        
),


В модуле Admin, привязан слой   'adminLayout'          => __DIR__ . '/../view/layout/admin.phtml',
По идеи с таким запросом должна выходить ошибка 404, что станица не найдена.
Прошелся по поиску и нашел установку layout по умолчанию \vendor\ZF2\library\Zend\Mvc\View\Http\ViewManager.php

В 237 строке заменил по умолчанию слой на свой siteLayout
И все стало на свои места, как я и хотел , запросы вида http://zf.local/signабвгд8ddd, http://zf.local/sign%asdfgh, http://zf.local/sign'+jksf стали выводить на 404ю... Скажите пожалуйста, это баг или у меня роутер не правильно настроен?

Оффлайн yanak

  • Опытный
  • ***
  • Сообщений: 89
  • Карма: 4
Трудно сказать баг это или необходимая фича. Но я бы перекрывал стандартный лайаут для экшена с ошибкой по-другому:

Переопределил бы в своем контроллере метод createHttpNotFoundModel(). И или бы у возвращаемой ViewModel вызвал бы метод setTerminal(true), чтобы вообще отключить рендеринг лейаута, а сам лейаут перенес бы в шаблон экшена. Или же назначил для данного метода нужный мне лейаут с помощью $this->layout('мой шаблон')

Оффлайн Stanislav WEB

  • Завсегдатай
  • **
  • Сообщений: 47
  • Карма: 5
  • SWEB
И это в каждом контроллере ?
Как можно переопределить слой, например в Module.php автозагрузке?

Оффлайн dolphin

  • Герой
  • *****
  • Сообщений: 527
  • Карма: 34
    • http://dolphin.orgfree.com
Станислав, вы опять "корректируете" код библиотеки "под себя" :))))) Вот честно, мне там тоже многое не нравится. Но вы представьте, что этот код уже закомпилен и ничего вы с ним сделать не сможете, вам так будет намного проще. В крайнем случае - есть issues на гитхабе, напишите, как это по-вашему должно выглядеть. Нафиг не пошлют - люди интеллигентные, а на душе легче станет :)))))
P.S.: Представьте, что вам нужно срочно обновить библиотеку, ну хотя бы по этой причине
www.securitylab.ru/vulnerability/438716.php
Все ваши "изменения" моментально окажутся затерты. И что вы будете делать?
P.S.2 Собственно, это касается не только зф2, у любого программного продукта могут быть баги, начиная от сервера(http://www.cvedetails.com/product/17262/Apache-Apache-Http-Server.html?vendor_id=45) и заканчивая базой данных (http://www.cvedetails.com/product/316/Mysql-Mysql.html?vendor_id=185): Так что данный подход, в принципе, справедлив для любого ПО, исходники которого вы можете изменить.
« Последнее редактирование: Август 16, 2013, 18:35:58 от dolphin »
http://front.net.ua Простите, что не на ZF - условия были не те :)

Оффлайн Stanislav WEB

  • Завсегдатай
  • **
  • Сообщений: 47
  • Карма: 5
  • SWEB
Спасибо Вам, я понял

Оффлайн drakulitka

  • Опытный
  • ***
  • Сообщений: 80
  • Карма: 1
  • Zend Framework
Трудно сказать баг это или необходимая фича. Но я бы перекрывал стандартный лайаут для экшена с ошибкой по-другому:
Переопределил бы в своем контроллере метод createHttpNotFoundModel(). И или бы у возвращаемой ViewModel вызвал бы метод setTerminal(true), чтобы вообще отключить рендеринг лейаута, а сам лейаут перенес бы в шаблон экшена. Или же назначил для данного метода нужный мне лейаут с помощью $this->layout('мой шаблон')


А можно подробнее на примере показать как переводить на свой шаблон, если в url присутствуют спецсимволы?