Size: a a a

2019 May 30

fe

from earth in WebSec
Кто сталкивался с тем, что серверу нужно прислать разметку?
Какие есть популярные структуры для этого?

Например, у нас есть место, где сервер присылает некое "описание" сущности, которое содержит гиперссылку.

Я вижу такие варианты решений:

1) (самый нерекомендуемый, озвучиваю для галочки) Сервер шлёт html текст, на клиенте он вставляется через innerHTML
2) Сервер шлёт какой-то особый формат, о котором договорились заранее. Например, сервис google pagespeed шлёт ответ примерно в таком виде:

{
 args: [
   { type: 'HYPERLINK', value: 'https://google.com', text: 'this link' }
 ],
 format: "Follow $1 for more details",
}


3) Сервер шлёт маркдаун, на клиенте парсится с помощью какой-либо маркдаун-либы
4) Сервер шлёт html текст, на клиенте используется библиотека для html-парсинга с вайтлистом тэгов


Важные моменты:
Строить разметку на клиенте желательно не только из соображений безопасности, но так же из-за удобства: для рендера тех же ссылок клиент должен использовать свой компонент <Link />, а не обычный <a />. При innerHTML эта возможность теряется.
источник

a

artalar in WebSec
Зависит от еще нескольких факторов...

Вариант с MD звучит не плохо, но я бы  сначала посмотрел исходники парсеров, есть подозрение что они там могут использовать innerHTML, а не свое дерево поэтапно строить
источник

AK

Alex Kanunnikov in WebSec
2 вариант самый вменяемый
источник

AK

Alex Kanunnikov in WebSec
при желании можно расширять и кастомизировать без головняка с парсерами и всякими xss
источник

NS

Nikita Shumilin in WebSec
в общем случаи насколько я понимаю задача такая
есть данные, в примере ссылка т.е. это объект с какимито свойствами {link: '', text: '' }
и то как показывать этот объект, знает только сервер, так ?
если вариантов конечное количество и не очень большое, то сервер может отдавать идентификатор компонента например 'myCoolLink' вместе с данными, а фронт по этому ид будет знать какой компонент использовать что нить в духе <my-cool-link link='link' text="text">
источник

fe

from earth in WebSec
Ещё вариант 5) есть)

5) Сервер шлёт полноценный document tree :)

[
 { nodeType: "text", value: "Follow " },
 {
   nodeType: "a",
   attributes: { href: "https://:google.com" },
   children: [
     {
       nodeType: "text",
       value: "this link "
     }
   ]
 },
 {
   nodeType: 'text',
   value: 'for more details.'
 }
]
источник

fe

from earth in WebSec
from earth
Ещё вариант 5) есть)

5) Сервер шлёт полноценный document tree :)

[
 { nodeType: "text", value: "Follow " },
 {
   nodeType: "a",
   attributes: { href: "https://:google.com" },
   children: [
     {
       nodeType: "text",
       value: "this link "
     }
   ]
 },
 {
   nodeType: 'text',
   value: 'for more details.'
 }
]
только это ещё уговорить на такое бэкендщиков надо постараться)
источник

fe

from earth in WebSec
Nikita Shumilin
в общем случаи насколько я понимаю задача такая
есть данные, в примере ссылка т.е. это объект с какимито свойствами {link: '', text: '' }
и то как показывать этот объект, знает только сервер, так ?
если вариантов конечное количество и не очень большое, то сервер может отдавать идентификатор компонента например 'myCoolLink' вместе с данными, а фронт по этому ид будет знать какой компонент использовать что нить в духе <my-cool-link link='link' text="text">
тоже вариант, хотя парсить посложнее, чем вариант 2) и к тому же каждый новый компонент надо придумывать как называть
источник

fe

from earth in WebSec
artalar
Зависит от еще нескольких факторов...

Вариант с MD звучит не плохо, но я бы  сначала посмотрел исходники парсеров, есть подозрение что они там могут использовать innerHTML, а не свое дерево поэтапно строить
да, с маркдауном похоже те же проблемы, что и с html-парсерами
источник

NS

Nikita Shumilin in WebSec
если бы бы 10 вариантов линков то я бы с сервера отдавал себе что нить в духе
{component: 'link', type: 'internalLink', href='/logout', text: 'go away!' }
{component: 'link', type: 'outside', href='http://google.com', text: 'ask me!' }
...
а для таблици к примеру
{component: 'table', type: 'withBorder', data=[some array], paging: {} }
источник

fe

from earth in WebSec
Nikita Shumilin
если бы бы 10 вариантов линков то я бы с сервера отдавал себе что нить в духе
{component: 'link', type: 'internalLink', href='/logout', text: 'go away!' }
{component: 'link', type: 'outside', href='http://google.com', text: 'ask me!' }
...
а для таблици к примеру
{component: 'table', type: 'withBorder', data=[some array], paging: {} }
Погоди, а остальная часть как выглядит? Где просто текст?
источник

NS

Nikita Shumilin in WebSec
в примере я всего два свойства передаю href и text
источник

NS

Nikita Shumilin in WebSec
а так то хоть сколько передавай
я незнаю контекста задачи, но это выглядит как архитектурная ошибка, на первый взгляд
источник

fe

from earth in WebSec
Nikita Shumilin
в примере я всего два свойства передаю href и text
Я имею в виду, что ты показал формат для ссылки, но для обычного текста нет
Ты подразумеваешь, что текст будет тоже элементом массива вида { component: 'text', text: 'Follow ' } ?
источник

fe

from earth in WebSec
напоминаю, задача получить маркап вида Follow <a href="..">this link</a> for more details.
источник

NS

Nikita Shumilin in WebSec
Да, к примеру это может быть тоже компонент, у которого может тип например type: 'danger'
источник

fe

from earth in WebSec
Nikita Shumilin
Да, к примеру это может быть тоже компонент, у которого может тип например type: 'danger'
Понял, спасибо
источник

fe

from earth in WebSec
Nikita Shumilin
а так то хоть сколько передавай
я незнаю контекста задачи, но это выглядит как архитектурная ошибка, на первый взгляд
Я тоже конечно так сперва подумал, и в идеале иметь коды сообщений, которые присылает бэк, а словарик описаний хранился бы на клиенте

Но тут два момента — конкретно эти описания это внутренняя кухня бэка, и именно там уже давно эти расшифровки хранятся во всех видах
Во-вторых, кроме ссылок ещё могут появится разве что тэги для жирного текста. Не ожидается, что какая-то ещё особая разметка появится когда-либо
источник

NS

Nikita Shumilin in WebSec
Но делает сильную связь, тут надо быть осторожным с этим
источник

ТК

Таймураз Кайтмазов in WebSec
from earth
Ещё вариант 5) есть)

5) Сервер шлёт полноценный document tree :)

[
 { nodeType: "text", value: "Follow " },
 {
   nodeType: "a",
   attributes: { href: "https://:google.com" },
   children: [
     {
       nodeType: "text",
       value: "this link "
     }
   ]
 },
 {
   nodeType: 'text',
   value: 'for more details.'
 }
]
У нас 2 вариант реализован
источник