IT-Security 33 Опубликовано: 9 марта 2009 Рассказать Опубликовано: 9 марта 2009 Приношу извинения за задержку, были проблемы со здоровьем А теперь к делу! Думаю, что у каждого хотя-бы раз в жизни возникало желание прикрутить какой-то модуль/PHP код к главной странице. Но была проблема с тем, как это сделать. Вы НАВЕРНЯКА пробовали пробовали вставить PHP код в шаблон и были сильно удивлены почему он не сработал? А потом применили хак на eval и тут уже задумались о безопасности Теоритически с установленным хаком на eval ЛЮБОЙ человек который получит доступ к редактированию шаблонов может взломать полностью сайт. Дабы не допустить даже теоритической дырки научу Вас как НЕ использовать php код, но вставлять его в шаблон Итак смотрим пример. Есть у нас код: <?php echo "Hello, world!"; ?> И хотим мы его вставить на главную. Открываем index.php и ищем: $tpl->load_template ( 'main.tpl' ); Ниже пишем: include (ROOT_DIR."/путь_к_файлу.php"); Открываем сайт - вуаля - видим вывод. Вот только одна проблема....Он над дизайном...Незадача, правда?Решаемо! Смысл в том, что шаблонизатор DLE устроен так, что берёт шаблон main.tpl, производит в нём замены и потом выводит его на экран. Нам нужно НЕМНОГО изменить нашу программку. А именно: В начало скрипта пишем: $my_mod_buffer = ''; Получаем примерно такое: <?php $my_mod_buffer = ''; echo "Hello, world!"; ?> Теперь нам нужно заменить ВСЕ echo в нашей программе на: $my_mod_buffer.= "код"; Тоесть получаем: <?php $my_mod_buffer = ''; $my_mod_buffer.= "Hello, world!"; ?> Далее идём в index.php и после include (ROOT_DIR."/путь_к_файлу.php"); пишем: $tpl->set("{my_mod_buffer}", $my_mod_buffer); Тэг {my_mod_buffer} необходимо ЗАРАНЕЕ поставить в main.tpl! Тоесть получается примерно такое в index.php: $tpl->load_template ( 'main.tpl' ); include (ROOT_DIR."/my_modules/my_super_mod.php"); $tpl->set("{my_mod_buffer}", $my_mod_buffer); ВНИМАНИЕ!Переменная $my_mod_buffer для каждого модуля индивидуальна! Жду вопросов/критики. Цитата Ссылка на сообщение Поделиться на других сайтах
www.zeos.com.ua 6 Опубликовано: 9 марта 2009 Рассказать Опубликовано: 9 марта 2009 (изменено) IT-Security, Большое спасибо! Вопросы: 1) Что такое Хак ? 2) Что такое Eval ? 3) Если я никогда не буду через админку редактировать шаблоны, то может не ставить права (CHMOD) 777 ? 4) Как правильнее писать? require_once ROOT_DIR . '/engine/init.php'; или include (ROOT_DIR . '/engine/init.php' 5) Как быть если есть такой php код который выводит результат зависящий от внешних факторов, то есть может выводить, а может и вообще ничего не выводить. И вот надо, чтобы когда он выводит, то выводилось, например, в таблице уже красиво отформатированной и дизайнерски оформленной под шаблон сайта. Но не хочеться html писать в php скриптах, надо как-то именно в шаблоне дизайн чтобы был! Как быть? Если же я создам такое в index.php $tpl->set("{xxx}", $xxx); а в шаблон вставлю: {xxx} и в шаблоне если {xxx} сделаю в таблицу и красиво оформлю, то если php код не выведет никакой информации, то таблица останется, а должна пропасть, если нету никаких результатов работы скрипта. P.S. Очень надеюсь 5 вопрос понятно написал Изменено 9 марта 2009 пользователем www.zeos.com.ua Цитата Ссылка на сообщение Поделиться на других сайтах
roman78 0 Опубликовано: 9 марта 2009 Рассказать Опубликовано: 9 марта 2009 $tpl->set("{xxx}", $xxx);пиши это прям в созданой пхпшке... Цитата Ссылка на сообщение Поделиться на других сайтах
www.zeos.com.ua 6 Опубликовано: 9 марта 2009 Рассказать Опубликовано: 9 марта 2009 (изменено) roman78, хм, а так даже удобнее! Спасибо! Что-то сам не догадался! Попробую. Не знаю, только правильно ли так делать? Хотя....., лучше оставлять в index.php, так более понятно, что вставляется, а то пришлось бы искать по файлах какая переменная вставляется. И в таком случае надо точно инклудить свой код после того как шаблон подгрузится, а именно после: $tpl->load_template ( 'main.tpl' ); Изменено 9 марта 2009 пользователем www.zeos.com.ua Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 9 марта 2009 Рассказать Опубликовано: 9 марта 2009 Автор 1) Хак - замена в коде. Бывают монолитные системы. тоесть целостные...Это DLE, так как в нём фиксированы модули. И когда что-то в коде меняется, то это называется хак. Впринципе даже в модульных системах замена кода системы - это хак. 2) Eval - функция, выполняющая всё, что она видит. Если передать в eval строку, содержащую PHP-код, то она его выполнит 3) На что именно ставить такие права? 4) Первый в случае отсутствия файла выдаст fatal error, второй нет 5) Перестроить код так, чтобы он нормально выводил. Цитата Ссылка на сообщение Поделиться на других сайтах
www.zeos.com.ua 6 Опубликовано: 9 марта 2009 Рассказать Опубликовано: 9 марта 2009 IT-Security, Спасибо большое! 3) На что именно ставить такие права? На папку с шаблоном и его файлами советуют ставить 777 права Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 9 марта 2009 Рассказать Опубликовано: 9 марта 2009 Автор ааа...Да это запросто Цитата Ссылка на сообщение Поделиться на других сайтах
roman78 0 Опубликовано: 9 марта 2009 Рассказать Опубликовано: 9 марта 2009 (изменено) Не знаю, только правильно ли так делать? так прописано во всех файлах дле, например строка из шоуфулл $tpl->set( '{edit-date}', $lang['time_gestern'] . langdate( ", H:i", $row['editdate'] ) ); кроме того аналогичную статью писал целсофт во времена когда трава была зеленее, небо голубее, а пиво не разбавляли... В любом случае думаю это ни на что не влияет и писать можно как удобнее. Изменено 9 марта 2009 пользователем roman78 Цитата Ссылка на сообщение Поделиться на других сайтах
www.zeos.com.ua 6 Опубликовано: 15 марта 2009 Рассказать Опубликовано: 15 марта 2009 Кто может обьяснить какая разница между: include ROOT_DIR . '/engine/init.php'; и include (ROOT_DIR . '/engine/init.php'); В файлах DLE 50% написано без скобок, а 50% написано со скобками. Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 15 марта 2009 Рассказать Опубликовано: 15 марта 2009 Автор Разницы никакой. Цитата Ссылка на сообщение Поделиться на других сайтах
www.zeos.com.ua 6 Опубликовано: 15 марта 2009 Рассказать Опубликовано: 15 марта 2009 (изменено) IT-Security, не подскажете, как решить такую вот задачку? Надо сделать так, что, если баннер в админке существует и включен на показ, то его содержимое, как и обычно, выводилось на сайте, но с нужным оформлением. А если баннера не существует или он выключен в админке, то чтобы не выводилось содержимое баннера и его оформление. Оформлением может быть в шаблоне, например, таблица. Пример: <table> <tr> <td>{banner_xxxxx}</td> </tr> </table> И надо, чтобы, если баннера не существует, то и пропадала бы вся таблица с ним! Но таблица должна быть прописана в шаблоне, а не коде баннера при создании рекламного материала в админке. Надо, чтобы было что-то подобное: в шаблон прописываю, например, так: [moybanner]ОФОРМЛЕНИЕ{banner_xxxxxx}ОФОРМЛЕНИЕ[/moybanner] Пробовал что-то такое вот написать, но, естественно, оно не работает. if (isset({banner_(.*?)})) { $tpl->set ( '[moybanner]', "" ); $tpl->set ( '[/moy_banner]', "" ); } else { $tpl->set_block ( "'\\[moybanner\\](.*?)\\[/moybanner\\]'si", "" ); } Но как же сделать, чтобы получилось? Вообщем, суть такая: Я в шаблоне пропишу много такого: [moybanner] <table> <tr> <td>{banner_разное-название}</td> </tr> </table> [/moybanner] И тот баннер, который включен, должен выводиться с оформлением, а те, которые выключены, не должны грузиться вместе с оформлением. Заранее спасибо! Решаю эту проблему уже месяца два и никак не могу догнать, как сделать! Пожалуйста помогите кто знает! Изменено 15 марта 2009 пользователем www.zeos.com.ua Цитата Ссылка на сообщение Поделиться на других сайтах
x-zone-x 3 Опубликовано: 15 марта 2009 Рассказать Опубликовано: 15 марта 2009 пробовал добавить эту таблицу туда где баннер добавляеш? <table> <tr> <td>тут баннер ссылка</td> </tr> </table> а не в шаблон Цитата Ссылка на сообщение Поделиться на других сайтах
www.zeos.com.ua 6 Опубликовано: 15 марта 2009 Рассказать Опубликовано: 15 марта 2009 (изменено) x-zone-x, читай внимательнее, что я пишу! Мне именно этот способ и НЕ подходит! Я хочу в баннер добавлять только код баннера, а не его оформление! А оформление должно быть в шаблоне. Изменено 15 марта 2009 пользователем www.zeos.com.ua Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 15 марта 2009 Рассказать Опубликовано: 15 марта 2009 Автор Это уже под статью не подпадает. Нужно хак писать, который бы обрабатывал тэги [if_banner]. Цитата Ссылка на сообщение Поделиться на других сайтах
Langly 7 Опубликовано: 17 марта 2009 Рассказать Опубликовано: 17 марта 2009 (изменено) Приношу извинения за задержку, были проблемы со здоровьем А теперь к делу! Думаю, что у каждого хотя-бы раз в жизни возникало желание прикрутить какой-то модуль/PHP код к главной странице. Но была проблема с тем, как это сделать. Вы НАВЕРНЯКА пробовали пробовали вставить PHP код в шаблон и были сильно удивлены почему он не сработал? А потом применили хак на eval и тут уже задумались о безопасности Теоритически с установленным хаком на eval ЛЮБОЙ человек который получит доступ к редактированию шаблонов может взломать полностью сайт. Дабы не допустить даже теоритической дырки научу Вас как НЕ использовать php код, но вставлять его в шаблон Итак смотрим пример. Есть у нас код: <?php echo "Hello, world!"; ?> И хотим мы его вставить на главную. Открываем index.php и ищем: $tpl->load_template ( 'main.tpl' ); Ниже пишем: include (ROOT_DIR."/путь_к_файлу.php"); Открываем сайт - вуаля - видим вывод. Вот только одна проблема....Он над дизайном...Незадача, правда?Решаемо! Смысл в том, что шаблонизатор DLE устроен так, что берёт шаблон main.tpl, производит в нём замены и потом выводит его на экран. Нам нужно НЕМНОГО изменить нашу программку. А именно: В начало скрипта пишем: $my_mod_buffer = ''; Получаем примерно такое: <?php $my_mod_buffer = ''; echo "Hello, world!"; ?> Теперь нам нужно заменить ВСЕ echo в нашей программе на: $my_mod_buffer.= "код"; Тоесть получаем: <?php $my_mod_buffer = ''; $my_mod_buffer.= "Hello, world!"; ?> Далее идём в index.php и после include (ROOT_DIR."/путь_к_файлу.php"); пишем: $tpl->set("{my_mod_buffer}", $my_mod_buffer); Тэг {my_mod_buffer} необходимо ЗАРАНЕЕ поставить в main.tpl! Тоесть получается примерно такое в index.php: $tpl->load_template ( 'main.tpl' ); include (ROOT_DIR."/my_modules/my_super_mod.php"); $tpl->set("{my_mod_buffer}", $my_mod_buffer); ВНИМАНИЕ!Переменная $my_mod_buffer для каждого модуля индивидуальна! Жду вопросов/критики. Все работает, спасибо. <?php $my_mod_buffer = ''; $my_mod_buffer.= "Hello, world!"; ?> Но в этой связке вот эта переменная лишняя$my_mod_buffer = ''; у меня без нее, а также эта штука без точки$my_mod_buffer.= "Hello, world!"; Вообще содержимое моего PHP файла такое: <? $filmlink= <<<HTML <tr> <td> <img src="images/01_26.gif" width="15" height="14" border=0 alt="АНОНСЫ ФИЛЬМОВ"></td> <td width="210" class="font_big"><H1 class="text_name_film"><b>АНОНСЫ ФИЛЬМОВ</b></H1></td> </tr> <!---link+---> <tr> <td> <img src="images/001_26.gif" width="15" height="14" border=0 alt="Загадочная история Бенджамина Баттона"></td> <td width="210"><a href="http://dvd-edem.ru/film1bb.php" class="font_big"><H1 class="text_name_film"><b>Загадочная история Бенджамина Баттона</b></H1></a></td> </tr> <!---end-link+---> <tr> <td colspan="2" align="center"><img src="images/sep.gif" width="195" height="2" border=0 alt=""></td> </tr> HTML; ?> оно выводится одновременно как в DLE, так и в другой скрипт. Работает и там и там. В майн DLE вставка :{filmlink} В индекс ДЛЕ вставка :$tpl->load_template ( 'main.tpl' ); include (ROOT_DIR."/codel.php"); $tpl->set("{filmlink}", $filmlink); В майн другого скрипта вставка :$filmlink В индекс другого скрипта вставка :include("codel.php"); Изменено 17 марта 2009 пользователем Langly Цитата Ссылка на сообщение Поделиться на других сайтах
www.zeos.com.ua 6 Опубликовано: 17 марта 2009 Рассказать Опубликовано: 17 марта 2009 (изменено) Langly, что-то я не понял смысл Вашего сообщения, это вопрос? брррр.... Изменено 17 марта 2009 пользователем www.zeos.com.ua Цитата Ссылка на сообщение Поделиться на других сайтах
Langly 7 Опубликовано: 17 марта 2009 Рассказать Опубликовано: 17 марта 2009 я написал что у меня все работает в том виде, в каком я привел. Он несколько отличается от представленного. Хз... вопрос-не вопрос... Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 17 марта 2009 Рассказать Опубликовано: 17 марта 2009 Автор Если в моём примере написать без точки, то с точки зрения PHP это будет ошибка уровня Notice... Я не был бы профессионалом, если бы давал ошибочный код, правда? Цитата Ссылка на сообщение Поделиться на других сайтах
Langly 7 Опубликовано: 17 марта 2009 Рассказать Опубликовано: 17 марта 2009 Если в моём примере написать без точки, то с точки зрения PHP это будет ошибка уровня Notice... Я не был бы профессионалом, если бы давал ошибочный код, правда? Странный вы какой то... Я понятия не имею профессионал вы или нет. Я написал так как я сделал. Оно работает. Если лучше сделать по другому (правильнее) так и скажите. А если объясните почему именно так, будет вообще здорово. Я вас поблагодарю. А оперировать туманными неинформативными фразами никчему. Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 17 марта 2009 Рассказать Опубликовано: 17 марта 2009 Автор Если в моём примере написать без точки, то с точки зрения PHP это будет ошибка уровня Notice... Что в этом непонятного?Тем более, что я писал пример без синтаксиса HereDoc, который Вы используете в своём примере. Так что: Но в этой связке вот эта переменная лишняя $my_mod_buffer = ''; у меня без нее, а также эта штука без точки $my_mod_buffer.= "Hello, world!"; Тут явно не в тему. Цитата Ссылка на сообщение Поделиться на других сайтах
d0tb0t 0 Опубликовано: 22 марта 2009 Рассказать Опубликовано: 22 марта 2009 а как быть если блок нужно вставить например в fullstory.tpl? вставляю один и тотже блок в main.tpl и в fullstory.tpl в main показывает в full выдаёт {xxx} что делать? Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 22 марта 2009 Рассказать Опубликовано: 22 марта 2009 Автор Зайти в модуль, который отвечает за fullstory (show.full.php) Цитата Ссылка на сообщение Поделиться на других сайтах
eleon 0 Опубликовано: 28 марта 2009 Рассказать Опубликовано: 28 марта 2009 Не очень понятно как это работает, если в скрипте нет ни одного "echo". В "index.php" прописано: <? include("file.php"); ?> А в "file.php" нет ни одного "echo" и "print". Данные сначала берутся с cbr.ru, потом кешируются и берутся с локального файла, поэтому не понятно как применить выше описанную инструкцию. Может, кто-то подскажет как исправить это дело? Цитата Ссылка на сообщение Поделиться на других сайтах
spam 11 Опубликовано: 28 марта 2009 Рассказать Опубликовано: 28 марта 2009 (изменено) Не очень понятно как это работает, если в скрипте нет ни одного "echo". В "index.php" прописано: <? include("file.php"); ?> А в "file.php" нет ни одного "echo" и "print". Данные сначала берутся с cbr.ru, потом кешируются и берутся с локального файла, поэтому не понятно как применить выше описанную инструкцию. Может, кто-то подскажет как исправить это дело? ТС взял код echo(); для примера, просто для наглядности Смысл в том что нужный php код не вставляется в шаблон а генерирууется скриптом, в примере ТС подключается php скрипт и результат его работы выводится в тег шаблона. Изменено 28 марта 2009 пользователем spam Цитата Ссылка на сообщение Поделиться на других сайтах
eleon 0 Опубликовано: 28 марта 2009 Рассказать Опубликовано: 28 марта 2009 (изменено) Дело в том, что следуя инструкции скрипт выполняется и появляется НАД дазайном, а загнать его в специальный тег шаблона никак не получается. Изменено 28 марта 2009 пользователем eleon Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.