- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как удалить плохие SEO-ссылки и очистить ссылочную массу сайта
Применяем отклонение ссылок
Сервис Rookee
Сам по себе подход такой используется практически везде (и не только в PHP). Он на поверхности и вполне естественный т.к. обуславливается тем как работает PHP. Различия только в конкретике реализации. Тут уже лучше погружаться в код (если есть интерес в обсуждении) - видео (тем более если будет без обратной связи) не имеет смысла, т.к. нужны вопросы - ответы. Так что если есть вопросы по реализации - спрашивай.
Я же говорю бездари.. давно уже не воспринимаю современных учёных с точки зрения истинности.
Состояние на сегодня на github
Аудит joke-php/templator на коммите eecfa4b7dec3897f24dafa30cd450abada15fa0b
Короткое резюме
Коммит eecfa4b7dec3897f24dafa30cd450abada15fa0b реализует шаблонизатор с компиляцией AST в PHP и последующим include кэшированного файла. Ключевой риск не в классическом eval , а в цепочке compileFile() → сырой TextNode → include $cache->path : при неограниченном пути к шаблону это даёт чтение произвольных файлов, а при попадании в шаблон текста с <?php ... ?> — исполнение PHP-кода из “текстового” шаблона.
Топ-5 критичных/высоких проблем в этом коммите:
twig {% foreach user in users %} {% foreach role in roles %} {{ user }} {% /foreach %} {% /foreach %}html <form method="post"> {% csrf %} <button>Save</button> </form>text composer install composer stan composer fixer composer test # Psalm в этом коммите не настроен; для него сначала нужно добавить зависимость и конфиг.Ну, мне по сути всё понятно уже. Сделать такое в принципе не проблема. Но для моего подхода такой способ всё равно не подходит, я же сделал инструмент для обычных людей, далёких от программирования, им не зачем изучать всякого рода шаблнизаторы для компиляции страниц и тп. Да без определённых знаний конечно не обойтись, но я как мог упростил создание страниц, по моему нет ничего проще чем простой HTML, а у меня XML с некоторыми дополнительными возможностями, вот и всё.
А причем тут "люди".? Это все работает под капотом. разработчику (а именно эту роль выполняет человек создающий сайт) не обязательно даже будет знать как это работает. очень условно у него будет метод подключения страницы (читай шаблона страницы). и он даже может не знать, что там вообще есть кеширование. Это, на мой взгляд, правильная работа хорошего инструмента. т.е. как пример псевдокодм
ShowPage('index.xml');Т.е. пользователь сказал что он хочет видеть страницу. Остальное не его проблемы. Даже могу продемонстрировать на твоем фреймворке. (на той версии что у меня и, оговорюсь, я уже подзабыл его детали реализации, так что только по беглому поиску и взгляду) Правда тут с некоторым допущением у тебя сразу логика запускается некоторая на основе разбора xml. Но ее можно упаковать (в этом случае правда больше подойдет "классический кеш" (наподобии как описан в PSR)
Т.е. все происходит внутри твоего метода. Это можно и не показывать пользователю, только дать ему инструмент сброса кеша по требованию
LFI/path traversal через includeFile() / compileFile() : путь к шаблону никак не ограничен корнем шаблонов и читается напрямую через file_get_contents() .
Да это пока сознательно. Сейчас вынашиваю мысль добавить в фрейморк сервисы для работы файловой системой и убрать это все туда. Но пока не решил когда это делать, если до релиза шаблонизатора не сделаю - то в шаблонизатор пока по сути "костыль" добавлю не дающий выползать ща пределы.
RCE через “обычный текст” шаблона: TextNodeHandler возвращает сырой текст без экранирования/нейтрализации PHP-тегов, а кэш затем исполняется через include .
Тоже понимаю. Пока идеология - не брать лишнюю ответственность. Т.е. разработчик должен позаботится о подготовке данных. Тут честно пока для себя не принял решение окончательное.
Расхождение compile vs render на отсутствующих ключах: compiled-mode генерирует прямой доступ вида $context['user']['name'] , тогда как render-mode идёт через resolveValue(..., $default) ; это ломает предсказуемость и приводит к предупреждениям PHP на пустых данных.
Пасиб. подумаю.
Потеря внешних локальных переменных в вложенных foreach при компиляции: внутренний цикл затирает список localVars , из-за чего обращения к переменным внешнего цикла компилируются уже как $context[...] .
Тут идея такая то все же localVars это переменные блока. тоже еще у меня нет 100% видения как правильно. Вероятно уже по обкатаю на том же проекте форума - может что пойму для себя. :)
Короткая рекомендация: вынести общий helper safe-access и использовать его и в compiled-mode, и в render-mode. Иначе библиотека остаётся непредсказуемой: один и тот же шаблон на тех же данных ведёт себя по-разному в двух режимах.
Интересно. подумаю
Тут из собственного опыта. На самом деле надо и так и так. Скорее всего будет добавлена директива типа csrf-input.
Короткая рекомендация: заменить “много strpos на каждом шаге” на линейный сканер или единый regex/token automaton. Это не security issue, но для engine-level кода уже заметная structural cost.
Да. TODO там не спроста :) обязательно этот вопрос будет изучаться.
покрытия на самые опасные сценарии этого аудита: literal <?php ... ?> внутри text node, path traversal через template path, parity compiled/render на отсутствующих ключах и parity nested-foreach по внешним локальным переменным
Об этом, если честно, даже не подумал...
по причине того, что так употребляется (по моим наблюдениям) наиболее часто
Вот в этом и вся беда человечества, не умных людей, которые бегут за толпой и не думают своей головой.
ЗЫ. Эксперимент с обезьянками помнишь, я лично его почти всегда в такие моменты вспоминаю.
Вот в этом и вся беда человечества, не умных людей, которые бегут за толпой и не думают своей головой.
ЗЫ. Эксперимент с обезьянками помнишь, я лично его почти всегда в такие моменты вспоминаю.
всё банально по методичкам..
Это, кстати, я могу аргументировать:
1. Любой человек в любой области накапливает опыт. В этом накопленном опыте ему что то нравится, что то нет и так далее. Переходя к разработке фреймоворков: вполне естественно, что имея за плечами опыт разработки в не учебных/академических проектах накапливаешь опыт: какие решения, идеи хорошие и удобные, какие нет. Соотвтственно и свое решение строишь с учетом опыта. Берешь на вооружение хорошее и удобное (и этом может быть алгоритмы, идеи, интерфейсы взаимодействия, те же стандарты, PSR и прочее и прочее) - делаешь свою реализацию, а что показалось плохим и не удобным переделываешь. Если опыта нет (особенно даже если учебного) - то тут будет все по максимуму свое. Но у меня нет цели делать из принципа "главное, чтоб не было похоже на что то существующее" (считаю такой принцип не разумным). по этому да у меня есть решения которые похожи на типовые.
2. Фреймоворк должен быть привычным. Особенно в той парадигме в которой задумал я: он должен подходить для максимального числа проектов (в т.ч. и для чайников - через создание на его базе конструктора сайтов или MCP сервера, помогающего чайнику объяснить словами свои хотелки ИИ, а тот ему сгенерит). А если расчет и на разработчиков глупо их полностью переучивать. Фреймворк должен помогать выполнять основную задачу, а не загружать мозг дополнительными навыками. При чем если делать исходя "главное чтоб не как у всех" придется и самому полностью переучиваться, а это не имеет смысла в тех моментах которые считаешь правильными.