LINUX.ORG.RU

Разметка контента

 , , ,


0

1

Привет Лор. Заинтересовал меня вопрос, как принято хранить форматируемый контент в 2016 году.
Сейчас у меня кастомизирован CKedit, который генерирует html, отправляет в бекенд (Rails), который вырезает нежелательные теги (реализовано с помощью стороннего гема+ собственные правила для всяких <script> и <style>). Собственно, результат записывается в бд, и во вьюшке это дело рендерится, кешируется. и показывается пользователю.
Собственно, нетрудно догадаться, что основная защита от всяких там инъекций это тот самый «фильтр», сканирующий контент перед сохранением. Но «фильтрует» он даже не по белому листу, а лишь по тем правилам, которые я описал. Понятное дело, что секурным такое решение назвать нельзя, особенно учитывая, что о всяких инъекциях я только с 3.5 статей знаю.
В общем, попробовал я поломать существующее решение, и таки получилось. При определенных обстоятельствах верстка таки съезжает и некоторый функционал становится недоступен. Меня это не устраивает, и вот, я здесь.
Собственно, как быть? Я знаю о bbcode, который позволит самому описать правила генерации выходного html, но его я не рассматриваю по 2м причинам. Во первых, сложное форматирование. Мне важны картинки в контенте, их расположение относительно текста и прочее. Кроме того - в контенте присутствует некоторый контент, сугубо индивидуальный, релизовываать который придется самостоятельно, что довольно затрудительно, учитывая сложную разметку контента. Во вторых, поигравшись некоторое время с гемом bb-ruby, а именно с инициализацией кастомных правил, я получил объемный файл с нечитабильными регулярками, поддерживать который стало невозможно, хоть это лишь реализация небольшой части желаемого. В третьих, отсутствие нормального редактора для этого bbcode, что в принципе не так критично, как п.1
Знаю про всякие Markdown, Textile, и т.п. но они не спасают от инъекций и полученный код все равно придется фильтровать.
Итого получается, что лучше html ничего и нет. Может есть какой то ман, как корректно настроить секурность html-контента от всяких инъекций и переопределения стилей? Или может вообще я параноик, и это не проблема вовсе.
Кстати говоря, то о чем сейчас идет речь, это не публичный интерфейс, а скорее интерфейс пользователя с привилегиями, и при нормальной работе доступа к нему рядовым пользователям не будет на уровне авторизации. Т.е. можно сказать, что автором этого контента буду только я.
Благодарю за внимание, проявленное к этой стене текста (объемно вышло как-то), и надеюсь на ваши советы.

★★★★

html без whitelist - плохо, потому что возьмут и в следующем году придумают новые теги, позволяющие выполнить js-код или сделать такое, что страница в ширину разъедется, или вырвиглазную анимацию вставлять.

Но если пользоваться интерфейсом будут только доверенные пользователи, то зачем сложные проверки контента? Лучше приложить усилия и обеспечить надежный контроль доступа к интерфейсу.

sholom ()
Ответ на: комментарий от sholom

html без whitelist - плохо

Я это понимаю, но это очень сложно и затратно. Для того же <img> сколько правил нужно описать. Всякие align, ограничения по maxwidth и т.д.

то зачем сложные проверки контента?

ну, что бы спокойно спать. Меня тревожит сама мысль что это _возможно_.

Лучше приложить усилия и обеспечить надежный контроль доступа к интерфейсу.

Полностью согласен, тем более, что и в этом я более компетентен, чем в вопросах верстки. Но все же, хочется сделать хорошо, и уделить внимание деталям.

comp00 ★★★★ ()
Ответ на: комментарий от comp00

Может быть, получится жестко задать ширину контейнера и поставить ему overflow: hidden, и тогда каким бы ни был контент (допустим, position:absolute и position:fixed отфильтрованы), он не сможет выехать за рамки или испортить вёрстку?

sholom ()

что мешает запретить все теги (просто заменяя знак < на его html-эквивалент)?

reprimand ★★★★★ ()
Ответ на: комментарий от sholom

Хм, а это идея.
Я так понимаю, при таком подходе наиболее страшен position (он мне в принципе не нужен вообще)?

comp00 ★★★★ ()
Ответ на: комментарий от reprimand

хм, использование этих самых html-тегов при форматировании? Т.е., я хочу что бы

<b>текст<b>
выглядел как текст
а не как <b>текст</b>
С минимальными при этом последствиями.

comp00 ★★★★ ()
Последнее исправление: comp00 (всего исправлений: 1)
Ответ на: комментарий от comp00

Да, из очевидного больше ничего не вспомнилось. Вроде все элементы, которые оказываются внутри контейнера, не смогут вылезти из него благодаря overflow: hidden.

sholom ()

bootstrap 3+, compass, less, scss, haml?

anonymous ()

нормализовать-канонизировать html-кашу например через tidy (всякие коряво закрытые тэги починит и проч.) потом можно им же в xml-форму (xhtml) которая может быть легко обработана например xslt или с любого языка через dom-api на предмет зачистить от нежелательных элементов-аттрибутов («черный список») либо скопировать в новый документ только разрешенные(типа «белый список»). дополнительно нормализация перед помещением в хранилку (с версионностью) поможет потом какие нить «диффчики» наряднее рисовать.

dab18 ()
Ответ на: комментарий от dab18

Это конечно очень хорошо, но сколько ж это времени будет занимать, для текстов порядка 10к строк... А если еще добавить постобработку, типа замены картинок на кликабельные thumbnails... А стоит оно того?

comp00 ★★★★ ()
Ответ на: комментарий от comp00

в таком случае, если ты хочешь дать пользователю возможность использовать форматирование, есть 2 пути:

1) Использовать для этого bb теги
2) Привести ВСЁ в вид <b>текст</b>, затем произвести поиск по разрешенным тегам, и превратить <b>текст</b> в текст

Более секурны вариант придумать сложнее.

reprimand ★★★★★ ()
Последнее исправление: reprimand (всего исправлений: 1)
Ответ на: комментарий от menangen

https://github.com/rgrove/sanitize

Его и использую, но там много кастомизировать надо. Например BASIC запрещает изображения, а RELAXED уже разрешает и стили, приходится брать более строгие правила и расширять белым листом.

comp00 ★★★★ ()

Знаю про всякие Markdown, Textile, и т.п. но они не спасают от инъекций и полученный код все равно придется фильтровать.

Что? Ты не можешь отключить обработку в них HTML и экранировать результат?

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.