Как стать автором
Обновить

Как НЕ надо делать информер с внешнего сайта на PHP

Время на прочтение2 мин
Количество просмотров788
Добрый день всем читающим!
Сразу хочу оговориться, здесь я расскажу об очевидных вещах для любого опытного PHP-программиста. Но в последнее время постоянно натыкаюсь у новичков на эту ошибку в том или ином ее проявлении.

UPD: господа, ну что за манера молча плевать в карму! неужели трудно написать, что конкретно не нравится в посте?

Человек делает свой первый (второй, третий) сайт. Называет все это дело информационным порталом. Начинание полезное. И вот человек решает разместить у себя на сайте информер со стороннего сайта. Многие сайты предоставляют специальный сервис для этих целей. Например Гисметео раздает html-код для вставки на свои страницы, многие банки тоже дают код для информера с курсами валют. Но что делать, если нужный сайт не дает такого сервиса?
Тут следует оговориться еще раз. Давайте мы опустим обсуждение правомерности размещения информации с чужого сайта без разрешения. Я не приветствую такие действия, но вот если человеку надо…

Итак, наш новичек решает вставить в нужном ему месте страницу с нужного URL. Что я вижу в исходнике:
...
include "http://...";
...

Это ужасно. Это очень и очень плохо. Тем, кто не понимает, чем это ужасно:
  • Как правило, если удаленный сайт не дает легальный код для информера, то в ответ мы получаем полноценную HTML-страницу, со своими заголовками, в своей кодировке и т.д. Как минимум это будет ужасно выглядеть, не впишется в общий дизайн сайта. А скорей всего это просто поломает макет страницы.
  • Команда inсlude просто берет текст, полученный по запросу URL, и вставляет его в текущее место программы, как исходник PHP. Это означает, что если с той стороны админ сайта отдаст специально сформированную страницу с кодом на PHP, этот код исполнится тут же на вашем сервере. Это самая банальнейшая инъекция. На глазах у изумленного новичка я сделал страницу, которая при таком инклюде перезагружала его сервер. Тут еще можно сказать, что на большинстве хостингов удаленный инклюд отключают, и правильно.

И в завершение расскажу как надо делать вставку стороннего контента, это сделал бы я.
В PHP есть поддержка такого приятного инструмента, как curl, который позволяет дергать контент с удаленных веб-серверов, причем с очень гибкими настройками, практически позволяя имитировать работу браузера. Контент помещается в переменную и затем обрабатывается. Можно обработать контент с помощю регулярных выражений, можно разобрать HTML с помощью XPath или другого парсера. В любом случае, нужно избавиться от всего лишнего и оставить голый полезный контент: текст, цифры и т.п. Затем эти данные проверяются на валидность и просто вставляются в родной макет страницы.
Никакого нарушения дизайна, никакой поломки макета, никаких инъекций в PHP.

PS. Стоит отметить, что мои доводы и демонстрация уязвимости не оказали нужного эффекта на начинающего коллегу, уязвимость не была исправлена. Через несколько дней сайт был взломан как раз с использованием этой уязвимости. Не повторяйте ошибок, учитесь на чужих. Удачи!
Теги:
Хабы:
-13
Комментарии22

Публикации