Как избежать кровотечения из текста Zalgo по всему месту без его полного удаления?

Наш веб-сервис был поражен некоторым текстом Zalgo, и я пытаюсь найти хорошее решение для будущего. Наша политика заключается в том, чтобы принимать все входные данные пользователя и сохранять их в постоянном хранилище (мы правильно кодируем вход для нашего бэкэнд, чтобы эта часть была в порядке). Во время выходной фазы мы запускаем исходный пользовательский ввод через фильтр/парсер с помощью белого списка, чтобы избежать атак XSS и другого хаоса. В последнее время некоторые пользователи нашли мир Залго, и они просто любят причинять некоторые неприятности другим людям с этим.

Как я вижу, текст Zalgo - это всего лишь фрагмент текста Юникода, который течет из предполагаемого контейнера. В результате, я думаю, что автоматическое удаление всех сложных комбинаций персонажей является слишком резкой защитой. Кто-нибудь знает трюк CSS, чтобы заставить текст Zalgo содержаться в данном родительском элементе без каких-либо неприятных побочных эффектов?

Например, если у меня есть

<section class="userinput">
... user input here ...
</section>

как я могу убедиться, что пользовательский ввод не течет за пределами границ section.userinput? Я думаю, overflow: hidden или clip: rect(...) может быть правильным ответом, но знаете ли вы что-то лучше для этого варианта использования? Я предпочитаю использовать section.userinput { max-height: 200vh; } или что-то подобное, чтобы пользователи не могли создавать искусственно длинные комментарии. Если какой-то комментарий был длиннее 200vh, он должен иметь полосу прокрутки только для этого комментария. Обычно для всей страницы должна быть только одна полоса прокрутки.

Обратите внимание, что я пытаюсь бороться с проблемой только в визуальном домене. Я с удовольствием принимаю любую действительную последовательность UTF-8 как пользовательский ввод, и я в порядке, если испорченный комментарий пользователя приводит к тому, что комментарий пользователя выглядит как дерьмо. Я только стараюсь избегать этого дерьма, переполненного повсюду. В частности, я не пытаюсь заблокировать текст zalgo или фильтровать zalgo-подобный текст перед отображением.

Ответ 1

После тестирования примера с Firefox и Chrome, я бы сказал, что лучше всего использовать объявление overflow: auto. Использование overflow: hidden имеет смысл, только если возможные полосы прокрутки считаются хуже, чем потеря пользовательского контента.

overflow: auto позволяет автоматически возвращаться к полосам прокрутки, если содержимое не умещается, и все равно вызывает обрезку выбранного элемента.

Декларация clip: rect(0,auto,auto,0); не годится, потому что она работает только с position: absolute; и без overflow: visible.

См. пример без overflow: auto для сравнения.