Убрать теги, кроме определенных & lt; span & gt; -s

Я немного застрял здесь. Я не знаю, какой подход является лучшим и наиболее безопасным. Я работаю с REST API и Handlebars.js.

контекст: У меня есть пользовательский контент, который мог выглядеть так:

<span class="user-link" data-id="12345" user-id="67890">
Name
</span>
Blablabla my comment
<script>
alert("malicious");
</script>
blabla
<b>bold</b>
<span onclick='window.location("http://maliciouswebsite");'>
bla
</span>

Цель : При выполнении POST для API, я хочу иметь возможность вырезать (или кодировать?) Все теги HTML, кроме <span class="user-link">[...]</span> один, поскольку я хочу представить его как чистый HTML в списке комментариев. Все остальное должно быть в кодировке HTML и показываться как текст. В случае любой злонамеренной вставки я также хотел бы удалить любое событие (например, «onclick» в теге span) и просто сохранить мои атрибуты «data-id» и «user-id».

Вопрос : Каким должен быть мой подход? Я полностью осознаю, что РЕГЕКЦЫ на HTML очень обескураживают. Должен ли я сделать <span class="user-link">[...]</span> BB-кода? Или я должен придерживаться простого Regex? Должен ли я пойти с JS или PHP? Как я должен идти о рендеринге текста безопасно?

Спасибо вам большое за ваше время! Любой совет / ссылка очень поможет.

1

Решение

Мои предложения

  • Вы можете ограничить разрешенный ввод на стороне клиента

    • вместо того, чтобы разрешать отправлять HTML, ограничьте ввод и разрешите меньше: bbcode или markdown
    • Handlebars.SafeString() — ссылка https://stackoverflow.com/a/21471546/1163786
  • применить проверку ввода на стороне сервера

  • применить проверку входных данных и фильтрацию на стороне сервера
    • см. ниже стрипты, фильтрация по белым спискам, черный список
  • никогда не забывайте, что только Чак Норрис может анализировать HTML с помощью регулярных выражений.

Основная тема — «Фильтрация и проверка входных данных» входящего пользовательского ввода.

Вы спрашивали о «наилучшей практике» или «как решить эту проблему».

Это описано здесь:

Для многих веб-приложений простого выхода из HTML недостаточно. Вы, вероятно
хотите полностью удалить любой HTML или разрешить небольшое подмножество HTML
через. Для этого используйте Очиститель HTML библиотека.

Но это очень медленно для сложного HTML. Подумайте о настройке решения для кэширования, чтобы сохранить очищенный результат для последующего использования.

Вы найдете пример кода для работы с HTML Purifier при переходе по последней ссылке. Очиститель использует подход белого / черного списка тегов HTML. Это медленно, потому что фильтрация — сложная задача.

Есть и другие инструменты: http://htmlpurifier.org/comparison

Когда вы ограничиваете разрешенный вход для уценки, тогда вы можете использовать анализатор уценки для подготовки вывода. Это все равно будет анализировать весь ввод, но быстрее, чем применение очистки белого / черного списка.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]