Markdown у HTML
Перетворити Markdown на HTML із санітизацією
Дані надсилаються на сервер, але не зберігаються
Цей інструмент не можна виконати у браузері, тому введені дані надсилаються на наш сервер. Ми обробляємо їх у пам'яті та одразу повертаємо результат: нічого не записується в базу, у файли чи в логи, нічого не передається третім сторонам. Та все ж не вставляйте сюди справжні робочі паролі чи ключі - для чутливих даних краще скористатися локальними інструментами.
Що робить цей інструмент
Перетворює Markdown на HTML тим самим CommonMark, яким рендерить статті цей сайт. Тому результат тут - буквально те, що з'явиться в блозі, а не приблизна оцінка іншим парсером.
Перемикач санітизації показує другу половину картини: що саме вирізає sanitizeHtml() перед публікацією.
Markdown у Laravel
// Хелпер Str: рендерить CommonMark
Str::markdown('## Заголовок');
// Через плинний рядок
str($post->content)->markdown()->sanitizeHtml();
{{-- У Blade: обов'язково через {!! !!}, бо це вже HTML --}}
<x-prose>{!! str($post->content)->markdown()->sanitizeHtml() !!}</x-prose>
// Листи в Markdown - окрема, старіша механіка
public function content(): Content
{
return new Content(markdown: 'mail.orders.shipped');
}
Санітизація - не косметика
Str::markdown() за замовчуванням пропускає сирий HTML із тексту. Це правильна поведінка для CommonMark і небезпечна для контенту, який пише не тільки редакція.
// Якщо $content від користувача - це XSS
{!! Str::markdown($content) !!}
// Правильно
{!! str($content)->markdown()->sanitizeHtml() !!}
sanitizeHtml() лишає безпечні теги - заголовки, списки, посилання, код - і вирізає <script>, обробники подій (onclick), javascript: у посиланнях та <iframe>. Спробуйте перемкнути прапорець вище на прикладі: скрипт зникає, решта розмітки лишається.
Саме тому попередній перегляд на цій сторінці показується лише для санітизованого варіанту: показати сирий HTML як текст - це сенс інструмента, вставити його у власну сторінку - те, від чого санітизація й захищає.
Що ще вміє CommonMark у Laravel
// Свої налаштування рендерера
Str::markdown($text, [
'html_input' => 'strip', // вирізати HTML ще на етапі парсингу
'allow_unsafe_links' => false, // прибрати javascript: посилання
]);
'html_input' => 'strip' - альтернатива санітизації після рендеру: HTML не потрапляє у вивід взагалі. Якщо користувачам не потрібен жоден HTML, це простіший і надійніший шлях.
Розширення CommonMark
Базовий CommonMark не має таблиць, закреслень і автопосилань - це розширення GitHub Flavored Markdown. Laravel підключає GFM за замовчуванням, тому таблиці й -блоки працюють.
Чого немає без додаткових розширень: виносок, списків задач - [ ], підсвітки синтаксису на сервері. Останнє на цьому сайті робить highlight.js уже в браузері - тому в HTML ви побачите звичайний <pre><code>, а кольори з'являються після завантаження сторінки.
- Де виконується
- на сервері
- Категорія
- Текст