Изображения с BBcode (php, preg_replace). Контрольный вопрос - PullRequest
0 голосов
/ 02 июня 2011

Bbcode вопрос.Это:

$text = preg_replace("@\[img\](.*)\[\/img\]@si",
"<img src=\"$1\" border=\"0\" />", $text);

работает нормально, но в то же время это большая проблема безопасности, например:

[img]http://www.domain.com/delete-account/[/img]

или

[img]http://www.domain.com/logout/[/img]

Любые идеи, какконтролировать это так, чтобы только ссылки на изображения, заканчивающиеся на .jpg, конвертировались в html?

[img]http://www.domain.com/image.jpg[/img]

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Согласно стандарту HTTP1.1 , запрос URL-адресов с помощью GET (метод, используемый для получения изображений) не должен приводить к каким-либо действиям, таким как выход из системы.Следовательно, вам не нужно ограничиваться URL-адресами с .jpg в конце, и, как правило, это плохая идея, поскольку существуют другие форматы изображений, а URL-адрес в целом не связан с типом содержимого.

Более того, если запрос URL меняет состояние сервера vulnerable.net, эту уязвимость подделки межсайтового запроса можно использовать в любом случае, настроивпользовательский сервер, который 302-перенаправляет http://evil.com/img.jpg на http://vulnerable.net/logout.

К вашему сведению, если вы действительно хотите заменить только URL-адреса, заканчивающиеся на .jpg, вы можете просто вставить его в группу:

$text = preg_replace("@\[img\](.*\.jpg)\[\/img\]@si",
                     "<img src=\"$1\" border=\"0\" />", $text);

Но это не механизм безопасности, и он дает сбой, если браузер (или агрессивно кэширующий прокси, или антивирусный сканер, или ...) предварительно выбирает URL-адреса.GET запросы не должны приводить к каким-либо действиям.

0 голосов
/ 02 июня 2011

Одним из способов решения этой проблемы является также проверка на стороне сервера, что запросы GEt и POST не эквивалентны.

A Запрос POST может изменить данные на стороне сервера, GET запрос не должен ничего менять.Это протокол HTTP.IMG-тег всегда является запросом GET.И браузер может выполнить этот запрос GET без какого-либо риска, поэтому проблема в на стороне сервера , каждое действие, которое может изменить данные изменения (база данных, сеанс и т. Д.), Должно проверять, что запрос POST.Например, ваш / post или / delete-account URL должен возвращать либо код 403 , либо код 200, но со страницей формы с запросом подтверждения POST .Если это неправильно в вашем приложении, то у вас будут проблемы не только с измененными тегами IMG, но, возможно, также с «спидерами html-страниц», которые выполняют предварительную загрузку ссылок GET, или даже с ботами.Вы можете найти копию этой превосходной книги . Вы можете найти некоторые проблемы с продвинутыми ссылками на изображения и фильтрацией.Например, ссылки на иностранные сайты иногда могут быть проблемой.Но эта проблема гораздо сложнее, чем начать с удобной обработки запросов GET и POST.

...