Безпечно обробляйте Markdown за допомогою методу inlineMarkdown у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 28 травня, 2025
Laravel пропонує потужний інструмент для обробки рядків — метод inlineMarkdown, який безпечно перетворює Markdown на HTML з вбудованим захистом від XSS. Досліджуйте, як цей метод може підвищити безпеку вашого контенту, зокрема в системах, що обробляють користувацький контент!

Метод inlineMarkdown в Laravel покращує обробку рядків, забезпечуючи безпечну трансформацію Markdown, сумісного з GitHub, в HTML з вбудованим захистом від XSS та налаштуваннями безпеки

Цей метод дозволяє безпечно конвертувати Markdown, надаючи детальний контроль над параметрами безпеки:

use Illuminate\Support\Str;
 
// Основна конвертація
$html = Str::inlineMarkdown('**Laravel**');
// Результат: <strong>Laravel</strong>
 
// Безпечна конвертація з параметрами
$html = Str::inlineMarkdown(
    'Inject: <script>alert("Hello XSS!");</script>',
    [
        'html_input' => 'strip',
        'allow_unsafe_links' => false,
    ]
);
// Результат: Inject: alert("Hello XSS!");

Цей метод особливо корисний для систем, що дозволяють користувачам генерувати контент:

class ContentProcessor
{
    protected $secureOptions = [
        'html_input' => 'strip',
        'allow_unsafe_links' => false
    ];
 
    public function formatPost(string $content)
    {
        return Str::inlineMarkdown(
            $content,
            $this->secureOptions
        );
    }
 
    public function processHashtags(string $content)
    {
        // Конвертуємо #hashtag в посилання, зберігаючи markdown
        $processed = preg_replace(
            '/#(\w+)/',
            '[#$1](/tags/$1)',
            $content
        );
 
        return Str::inlineMarkdown(
            $processed,
            $this->secureOptions
        );
    }
 
    public function formatSystemMessage(string $template, array $variables)
    {
        $content = strtr($template, $variables);
 
        return Str::inlineMarkdown(
            $content,
            [
                'html_input' => 'escape',
                'allow_unsafe_links' => false
            ]
        );
    }
}
 
// Використання
$processor = new ContentProcessor();
 
$post = $processor->formatPost('**Breaking** news update!');
$hashtag = $processor->processHashtags('Love #Laravel development!');

Метод ідеально підходить для форумів і систем обговорення, де потрібні безпечні формати:

class ForumPostService
{
    public function processReply(string $content, User $author)
    {
        // Обробка кодових блоків і форматування
        $formatted = Str::inlineMarkdown($content, [
            'html_input' => 'strip',
            'allow_unsafe_links' => false,
            'use_autolinks' => true
        ]);
 
        return $this->addAuthorContext($formatted, $author);
    }
 
    public function formatQuote(string $originalContent, string $newContent)
    {
        $quote = "> " . str_replace("\n", "\n> ", $originalContent);
        $combined = $quote . "\n\n" . $newContent;
 
        return Str::inlineMarkdown($combined, [
            'html_input' => 'strip',
            'allow_unsafe_links' => false
        ]);
    }
 
    public function processCodeSnippet(string $content)
    {
        return Str::inlineMarkdown($content, [
            'html_input' => 'strip',
            'allow_unsafe_links' => false,
            'use_underline' => false // Запобігання конфліктів з кодом
        ]);
    }
}

Для систем сповіщень, що потребують форматованих повідомлень:

class NotificationFormatter
{
    public function formatActivityUpdate(Activity $activity)
    {
        $template = '**{user}** {action} в *{project}*';
 
        $message = strtr($template, [
            '{user}' => $activity->user->name,
            '{action}' => $activity->description,
            '{project}' => $activity->project->title
        ]);
 
        return Str::inlineMarkdown($message, [
            'html_input' => 'escape',
            'allow_unsafe_links' => false
        ]);
    }
 
    public function formatSystemAlert(string $message, array $context = [])
    {
        $processed = strtr($message, $context);
 
        return Str::inlineMarkdown($processed, [
            'html_input' => 'strip',
            'allow_unsafe_links' => false,
            'use_autolinks' => false // Вимкнено для безпеки
        ]);
    }
}

Метод inlineMarkdown забезпечує безпечну обробку Markdown, пропонуючи всебічний захист від XSS, при цьому зберігаючи гнучкість для форматування контенту користувачів через типовий синтаксис Markdown, такий як жирний, курсив, посилання і фрагменти коду