ФорумПрограммированиеПыхнуть хотите?Готовые решения → Мой нативный шаблонизатор STemp 2.0

Мой нативный шаблонизатор STemp 2.0

  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 10:36, спустя 7 часов 30 минут 14 секунд

    artoodetoo, у меня знакомый балуется немного поиском дыр по сайтам.
    Показывает иногда дырки … 99% это или потеряли ":"  в [:varname], или 31 запрос.

    Блоки … после вызова функции get_block() вы получаете "защищенный код".
    И правило "В шаблон заходят только защищенные значение" не нарушается.
    Всё нормуль.

    А вариации [name] и [:name] появляются, ибо в шаблон приходят незащищенные значения … и Вам приходится помнить, это фильтруем, а это не фильтруем.

    Если все значения, которые передаем в шаблон сразу фильтровать, то подом и думать не надо, откуда эти значения (блок или переменная) - пофиг - все они защищены и мы их просто выводим.

    Думать надо только над значениями, которые вы сознательно захотели получить без защиты… это я про ту функцию с длинным вторым параметром.

    Когда знакомый дырки показывал на сайтах раньше .. я всегда удивлялся … как так можно написать? 15 страниц нет дырок - 16 дырявая. Спору было много … теперь и он согласен со мной "как так можно писать" ?
    Спустя 87 сек.
    artoodetoo, private static function _escape()  – научите его рекурсивно массивы обрабатывать.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 10:41, спустя 5 минут 10 секунд

    AndryG, интересное замечаение и даже верное
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 10:53, спустя 11 минут 33 секунды

    AndryG, мне кажется вы не поняли проблему "двойной фильтрации"

    научите его рекурсивно массивы обрабатывать.

    с какой целью?

    Спустя 99 сек.
    если вы предлагаете при вызове _escape() указывать не "что фильтровать", а "что не фильтровать" — тогда согласен, в этом есть смысл. а фильтровать просто все рекурсивно — чушь.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 10:55, спустя 2 минуты 12 секунд

    artoodetoo, ну какже, а какже передача пользователю ВСЕХ ДАННЫХ РЕКУРСИВНО?)))))))))))
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 11:15, спустя 19 минут 57 секунд

    ладно phpdude, не издевайся. для AndryG я изготовил вариант "все кроме рекурсивно"

    правда класс потерял свою девственную простоту и поэтому мне больше неинтересен.


    class MyView
    {
    public static function render($viewId, $viewData, $excludes = NULL)
    {
    extract($viewData, EXTR_REFS);
    if (is_null($excludes))
    array_walk_recursive($viewData, array('self', '_escapeAll'));
    else
    array_walk_recursive($viewData, array('self', '_escapeAllBut'), $excludes);
    require SITE_ROOT.'views/'.$viewId.'.php';
    }

    public static function fetch($viewId, $viewData, $excludes = NULL)
    {
    ob_start();
    self::render($viewId, $viewData, $excludes);
    return ob_get_clean();
    }

    private static function _escapeAllBut(&$item, $key, $excludes)
    {
    if (!in_array($key, $excludes))
    $item = htmlspecialchars($item);
    }

    private static function _escapeAll(&$item, $key)
    {
    $item = htmlspecialchars($item);
    }
    }
    ………
    $content = MyView::fetch('logs', array(
    'start' => 1252610188.9355,
    'logs' => $logs));
    MyView::render('mainLayout', array(
    'page_title'=> 'Milestone I. test 2',
    'hypertext' => 'Some <b>tagged</b> text',
    'content' => $content),
    array('content')); // try to remove this array

    ιιlllιlllι унц-унц
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 11:29, спустя 14 минут 3 секунды

    Мой основной текст и замечание про escape не связаны.

    Двойная фильтрация возможна:
    1. В шаблон передают нефильтрованые значения (assign($name,$value) не вызывает внутри себя escape())
    2. Фильтрация происходит между кодом шаблона и потоком вывода ( echo $this->escape($value))

    Ваш новый код мне вообще не понятен. Зачем?
    Спустя 98 сек.
    "Зачем" .. я имел ввиду зачем два метода. Просто в первом рекурсию поставить, чтобы он фильтровал значения в таблицах/вложенных таблицах
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 11:36, спустя 7 минут 13 секунд

    ну непонятно и ладно. не расстраивайтесь ;)
    Спустя 52 сек.
    я вас тоже совсем не понимаю. какой такой ассайн-массайн ипочему он внутри себя ничего не вызывает :)
    Спустя 159 сек.
    отследите слово 'content' и может быть поймете
    Спустя 113 сек.
    еще посмотрите в словарях слова "exclude" и "all but"
    ιιlllιlllι унц-унц
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 11:42, спустя 5 минут 43 секунды

    :)

    // фильтрун
    protected function defence($var){
    $res = null;
    if(empty($var) || is_object($var)){
    return $var; // не решил , что делать с объектами - пока так.
    }elseif(is_array($var)){
    foreach($var as $k=>$v){
    $res[htmlspecialchars($k)] = $this->defence($v);
    }
    }else{
    $res = htmlspecialchars($var);
    }
    return $res;
    }

    /**
    * Подключение данных к вьюверу
    * @param string|array имя параметра или масссив параметров (имя->значение)
    * @param mixed Значение параметра
    */
    public function assign($tpl_var,$value=null){
    if(!is_array($tpl_var)){
    $tpl_var = array($tpl_var=>$value);
    }
    foreach ($tpl_var as $key => $val) {
    if ($key != '') {
    $this->tpl_vars[$key] = $this->defence($val); // В шаблонизатор попадают только фильтрованные значения
    }
    }
    }


    Таким макаром, все значения. Которыми будет оперировать шаблон - защищены. Мне не надо думать, что и где фильтровать. В шаблоне я просто вывожу данные. И двойная фильтрация мне не грозит, ибо _Я_ не фильтрую … это забота assign()
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 11:49, спустя 7 минут 31 секунду

    AndryG, как выглядит то! DEFENCE!!!

    http://ru2.php.net/manual/en/function.array-walk-recursive.php

    …..
    Сапожник без сапог
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 11:53, спустя 3 минуты 51 секунду

    Если правильно проследил слово 'content', "Some <b>tagged</b> text" выведет без жирности с тегами "как текст", а в content теги будут "как теги".

    Возникает вопрос … почему в шаблон приходит html-код? Это шаблон его должен генерить.
    Всё. Хватит. У каждого своё. :-)

    Спустя 93 сек.
    phpdude, перепишем. А название мне нравится :) … звучит!
    Спустя 33 сек.
    Никогда не хвалился, что знаю все функции языка. Теперь на одну больше. :)
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 11:56, спустя 2 минуты 43 секунды

    Мне не надо думать, что и где фильтровать

    думать надо, батенька!
    - с фильтрацией у вас как-то очень неочень. два вложенных цикла и еще через метод объекта. оно работает?
    - все-таки как насчет более одного шаблона? сначала контент, затем подставить в общий макет страницы. это распостраненный прием. как будет выглядеть такая страница У ВАС? подумайте
    Спустя 145 сек.
    все, мои батарейки сели. я больше немогуууу
    ιιlllιlllι унц-унц
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 12:27, спустя 30 минут 38 секунд

    "- с фильтрацией … " Где два цикла?
    У меня и работает с кучкой шаблонов.

    Супервизор нужен … он при глюках проблемах с питанием Reset зажимает … на подсевших батарейках … сбоить начало.
  • AndryG

    Сообщения: 237 Репутация: N Группа: Адекваты

    Spritz 11 сентября 2009 г. 12:38, спустя 11 минут 30 секунд

    Когда я пишу шаблон, я думаю о шаблоне, а не о хаках, защите и фильтрах.
    Про это я подумал, когда класс шаблонизатора писал.

    Более одного шаблона. Подумал. Вернет мне get_block() кусок правильного и нормального html-кода.
    $block_data = $this->get_block('blockname');
    Я его и выведу где надо.
    echo $block_data;

    Надо вывести переменную … echo $username … если это и был хакер с именем "<b>Error</b>" .. то мне пофиг, его имя еще при добавлении в переменные для шаблона было профильтровано и "обезврежено".

    Нет тут двойной фильтрации.

    shutdown.
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 11 сентября 2009 г. 13:04, спустя 25 минут 49 секунд

    хз, что за get_block такой. мой класс весь на виду, шаблоны и тестовые данные в архиве.
    у тебя я вижу в исходниках один охуенный assign — извини, это плохой код. ничего больше не надо.

    удачи!
    ιιlllιlllι унц-унц
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 11 сентября 2009 г. 14:35, спустя 1 час 30 минут 46 секунд


    я вот непомнимаю - хули тебе нормальные шаблонизаторы не нравятся?))

    Покажи мне нормальный нативный шаблонизатор. Чем не нравятся остальные — написано во вступлении (второй абзац).




    Во-вторых, в шаблонизаторе не должно быть доступа к переменным, которые в него не переданы, и к функциям, которые в нем не определены.
    Я бы не был столь категоричным. Я бы в шаблонизаторе поставил "защиту от дурака". "Если ты добираешься до непереданных тебе значений - делай это сознательно". Шаблонизатор содержит логику … пусть она "всего-лишь логика отображения", но и ей могут понадобится различные данные .. не обязательно для отображения … пусть только для анализа.

    Если могут понадобиться какие-то значения, разработчик должен знать о том, что они понадобятся, уже в контроллере.

    Не проникся фильтрацией тегов. bb-code привычней.

    Не перевариваю бб-коды. Какое-то не рыба, не мясо. Недоделанное что-то, и, самое интересное, не понятно, зачем оно надо.

    Я бы указал типы результатов … зачем зря читателя напрягать (а ещё лучше пример возвр. значений)

    Не понял к чему это.

    Почему в контроллере решаем, что будет подключать шаблонизатор ?
    И в итоге почти все контроллеры почти всегда стартуют из index.tpl.php
    Смешиваем логики C и V. Или нет?

    Нет. В контроллере решаем, что подключать. В index.tpl.php только подключаем. Где там контроллеры?

    Потенциальная дыра.
    Отстегиваем страховку и надеемся только на самого себя - экстремал.
    Отключать XSS-защиту приходится, ибо в значении, наверно, теги встречаются?

    По-умолчанию она включена. Отключить ее можно, например, чтобы вывести текст, добавленный админом, в котором злобных xss быть не должно.

    Может лучше пусть раскрывает массив значений в переменные?
    будет не $this->articles['content'], а articles['content']

    Возможно. Подумаю над этим.

    Я бы поменял параметры местами и Format установил бы тоже значение по умолчанию, а для $timestamp: "не указан или null -> текущее время"

    И какой же формат поставить по-умолчанию?

    Расширил бы до возможности принимать ассоц. массивы [name] => value.

    Если я правильно понял, чтобы каждый элемент массива становился отдельной переменной? А как быть, если нужно передать именно массив?))

    Основная идея шаблонизатора: впихнуть нужные значения в существующий шаблон. Получается, что мы не ждем HTML-кода в значениях и всячески от него там избавляемся (XSS). Тут мы озадачиваеся не просто защитой, а обработкой кода (string tagsParser(string $str);) …похоже на игру со спичками на автозаправке заправке.
    В общем … не проникся я идеей tagsParser и компании.

    Не уловил, в чем тут игра со спичками.

    "Хелперы" ( # morph / морфологически правильное окончание слова # formatDate / форматировать дату # getRuMonth / русское название месяца) это хорошо. Надоть развивать это направление.

    Это развивается в процессе нужды) Как появится что-то необходимое в процессе работы, так и добавляю.


    ахуенный шаблонизатор придумали мы с аретдоо, там и хсс хорошо обрабатывается и прочие вещи куда удобнее и лаконичнее.

    мне не похуй что написать.

    у меня вот так

    Избыточный псевдоязык? Спасибо, нет. Зачем мне учить твои конструкции, если есть php? Может ты еще все функции переопределишь? Нахуй писать htmlspecialchars, если можно написать hsc()? Нахуй писать echo, если можно написать e? Нахуй писать <html>, если можно написать <h>?)))

    [. header.tpl] - подключить шапку. ахуенна не правда ли? всяко лучше чем $stemp->setIncludeFile("article.tpl.php"); + его обработка в шаблоне.

    Просто $this->includeFile('header.tpl') в шаблоне.

    [::$var ] = urlencode. пиздатенько, не правда ли?

    Хуйня) Непонятно, почему так, поэтому хуй запомнишь, + нечитабельно.


    в списке методов нету __set но есть __get настораживает

    Чем? По этому поводу я уже объяснял. Я не использую __set чтобы подчеркнуть передачу переменной.


    $article = $blog->getArticle($_GET["article_id"]);
    $comments = $blog->getCommentsToArticle($article["id"]);


    у тебя странный стиль разве $_GET["article_id"] != $article["id"] ?
    удивляет

    Это же пример блядь)

    <?php echo $this->title ?>

    просто убило. что незя было сделать {$page->title}

    дальше не читал

    Нельзя. Это нарушает идеологию шаблонизатора. Он нативный, и никаких излишних синтаксисов в нем не будет.


    Откуда появляются дыры в сайтах? От "недофильтрования".

    У шаблонизатора не должно быть функции [:name] или ещё как … "вернуть_htmlscpecialchars(name)" …
    у него, допустима функция дай_НЕфильтрованное_значение($name) … и второй параметр, желателен … строковый, который всегда обязателен и должен равняться "Я осознаю, что я прошу и беру ответственность на себя. Я трезв и не хочу спать".

    Шаблонизатор всегда должен отдавать защищенные данные … и только по сильному требованию - НЕзащищенные.

    А варианты [name] и [:name] – прямой путь к ошибке по недосмотру или запавшей кнопке.

    Все настраиваемо. По-умолчанию, все переменные обрабатываются перед отдачей. Если админ дурак и отрубит защиту там, где это не нужно — то тут уже ничем не поможешь.
    Спустя 42 сек.
    Блядь, тут еще и вторая страница!!!

Пожалуйста, авторизуйтесь, чтобы написать комментарий!