За последние 24 часа нас посетили 18344 программиста и 1653 робота. Сейчас ищут 1752 программиста ...

Мой простой шаблонизатор

Тема в разделе "Решения, алгоритмы", создана пользователем Awilum, 1 май 2011.

  1. guest2013

    guest2013 Активный пользователь

    С нами с:
    19 ноя 2007
    Сообщения:
    109
    Симпатии:
    0
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    http://php.net/short-open-tag
    тогда я не понял
    при чем здесь интерпретатор...
     
  3. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    я имел в виду если вызвать шаблон напрямую в строке адреса, а не через include

    то он исполняться не будет, а превратится просто в текст.
     
  4. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    [vs]

    я не понимаю, что вы хотите сказать... шаблонизаторы обычно вырезают php теги из шаблонов.
    Пример выше.

    да и шаблон то не инклудится на прямую, а инклудится обработанный вариант (скомпилированный)
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Awilum
    Т.е. ты хочешь сказать, что твой шаблонизатор вырежет <? и ?>? А если у меня документе - XML? Он испортится.
    А если не вырежет, то php-код между этими дескрипторами будет выполнен, потому что на любом хостинге включены short tags.
     
  6. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    Ничего у меня не вырежет. Я этой цели не добивался: запретить навсегда php в шаблоне.
    Но в других шаблонизаторах это реализовано.
     
  7. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    отлично, вырезаем все теги php и приводим шаблон к стандарту шаблонов.
    еще лучше экранируем первый вход на
    HTML:
    1. &lt;?
    php -- НЕТ, скрипты шаблона -- ДА
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    "<?" и "?>" - это общие для PHP и XML дескрипторы.
    Типичная ситуация - отправка XML на сервер из джаваскрипта:
    HTML:
    1. function sendRequest(id) {
    2.      var body = '
    3. <?xml version="1.0"?>
    4. <user>
    5. <id>'+id+'</id>
    6. </user>';
    7. ....
    8. }
    9.  
    если твой шабонизатор что-то сделает с дескрипторами, этот скрипт сломается.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    и сохраняем закрывающий ?> - в eval это вызовет синтаксическую ошибку, в include - последующая часть скомпилированного шаблона отобразится просто текстом.
     
  10. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    Код (Text):
    1. //xml substitution
    2. $template_code = preg_replace( "/\<\?xml(.*?)\?\>/", "##XML\\1XML##", $template_code );
    3.  
    4. //disable php tag
    5. $template_code = preg_replace( array("/\<\?/","/\?\>/"), array("&lt;?","?&gt;"), $template_code );
    6.  
    7. //xml re-substitution
    8. $template_code = preg_replace( "/\#\#XML(.*?)XML\#\#/", "<?php echo '<?xml' . stripslashes('\\1') . '?>'; ?>", $template_code );
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Если шаблон выполнется нативно, избежать php-инъекции невозможно. Поэтому такие шаблоны не подходят для систем, где к шаблонам имеют доступ все кто попало.
     
  12. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    ничо не вырезать , адекватный человек не будет мешать php с template-script-xhtml

    [​IMG]

    компиляция шаблона устранит все проблемы

    если речь пошла об инъекциях, то можно посмотреть как эта проблема решена с MYSQL запросами
    , а имеено функция mysql_real_escape_string

    тоже можно сделать и для шаблона, функцию которая будет экранировать все php скобки

    и я не совсем понял где инъекция то будет? конструкция в eval является логическо-интерпретируемой, а не статично-текстовой , что исключает инъекции внутри переменных
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это неплохое решение, но неоднозначное. "<?" может использоваться для каких-нибудь операций, в том же javascript могут юзаться регулярные выражения. И получается что шаблонизатор изменяет строки, которые к нему прямо не относятся.
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Инъекция php-кода в шаблон. Чего непонятного?
     
  15. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    нереализуемо . так как к шаблону нет доступа как и ко всем файлам php которые на сервере. инъекции нет.
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    тогда зачем запрещать вставлять php-код внутрь шаблона? Себе запрещать? :)
     
  17. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    я уже от этого отказался, вы не следите за диалогом?

     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Alex_pac
    значит я просто не понял суть =) Но не вижу ничего плохого в том, чтобы генерировать javascript или xml с помощью шаблонов.
     
  19. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    TCodes 1.0.4
    + Возможность отключить php для шаблонов. $allow_php_tag = false;
    + Новый tcode {php:[ code here... ]}
     
  20. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    TCodes 1.0.5
    + Новый tcode {:$var} - короткое echo
    + Новый tcode {run:function()}
    + пофиксина регулярка...
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    вротмненоги :D
     
  22. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    и че ?
     
  23. Awilum

    Awilum Активный пользователь

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    Тут подумал как все такие лучше ?

    $tpl -> assign('name',$username);
    $tpl -> template($template);

    или

    $vars['name'] = $usetname;
    $tpl -> template($template, $vars);


    В CI сделано как во втором варианте. Я привык, удобно.. Может в первом способе есть какой то профит ?
     
  24. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Я бы вообще сделал через __set.
     
  25. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    Awilum

    $tag_start
    $tag_end

    надо экранировать через preg_quote