Редакторът за форматиран текст взема HTML от браузър, а на браузъра не може да се вярва. RayCraft Write приема всичко, което идва от браузъра, за недоверено и го филтрира на сървъра, преди вашият код да го види.
Какво прави ContentFilter
- Остават само елементи от списък с разрешени (списъкът по подразбиране покрива текст, списъци, таблици, изображения, връзки, фигури, details, аудио, видео и рамки със
sandbox).script,style,object,embed, форми и всичко останало се махат. - Атрибутите за събития (
onclickи подобни) винаги се махат. - Атрибутите се разрешават за всеки елемент поотделно: например
href,target,relза връзки;src,alt,width,height,loadingза изображения;colspan,rowspan,scopeза клетки. - Адресите се проверяват:
javascript:и подобни схеми се махат. Връзките запазватhttp,https,mailtoиtelи относителните адреси. - Рамки се запазват само за хостовете от
Embed.AllowedHosts(по подразбиранеwww.youtube-nocookie.comиplayer.vimeo.com) и винаги съсsandbox. - Атрибутите
styleсе свеждат до списък от безопасни свойства.
Списъците се сменят с AddRte(o => o.Filter = new ContentFilterOptions { ... }). Стойностите по подразбиране са в ContentFilterOptions.DefaultAllowedTags, DefaultAllowedAttributes и DefaultAllowedAttributesByTag.
Къде се прилага
- Вързаната
Value, която редакторът праща към страницата ви (FilterIncomingHtml, включено по подразбиране). - HTML, който задавате със
SetHtmlAsyncилиInsertHtmlAsync, и HTML, който първо се рисува на сървъра. - Поставено съдържание (то се чисти от разметката на Word и Excel още в браузъра, но на браузъра не се вярва: последната дума е на сървърния филтър).
Когато ползвате Rte.Processing без редактора (например в API, което получава HTML), извиквайте ContentFilter.Filter сами.
Преобразувания
Преобразуванията в Markdown и JSON не пропускат суров HTML. Изходите за писма и статичният изход се правят от филтрирания HTML.
Файлове и качване
FileSystemMediaStoreпроверява разширението спрямоUpload.AllowedTypesиAllowedImageTypes, проверява първите байтове на изображението, ограничава размера (Upload.MaxFileSize) и никога не ползва път от браузъра такъв, какъвто е.- Качването върви по връзката SignalR на страницата, затова иска същото оторизиране като страницата. Собствен
IRteMediaStoreтрябва сам да оторизира всяко извикване: редакторът не знае кои са вашите потребители. - Сервирайте качените файлове от папка, в която не могат да се изпълняват скриптове, и за потребителско съдържание предпочитайте друго име на хост.
Какво остава ваша отговорност
- Кодиране на изхода: показвайте записания HTML само след филтриране и с
StaticRender.Renderили в страница, която не изпълнява потребителски скриптове. - Оторизиране кой какъв документ може да редактира (
DocumentIdе име, а не право). - Ревизии и коментари във вашите хранилища: прилагайте свои правила за достъп.
- Политика за сигурност на съдържанието (CSP) за вашия сайт. Редакторът зарежда скриптовете и стиловете си от
_content/Rte/, а за формули и диаграми може да заредите KaTeX или Mermaid от място по ваш избор. - Защита на токена за feed-а (Инсталация).
Съобщаване на проблем
Ако намерите начин да прекарате скрипт през филтъра или да прочетете файл извън папката за медия, съобщете на RayCraft, преди да го публикувате. Данните за връзка са във файла с лиценза (Лиценз).
Готови ли сте да пробвате RayCraft Write?
Започнете 14-дневния пробен период, без карта.
Започнете 14-дневен пробен период