Я немного застрял здесь. Я не знаю, какой подход является лучшим и наиболее безопасным. Я работаю с 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? Как я должен идти о рендеринге текста безопасно?
Спасибо вам большое за ваше время! Любой совет / ссылка очень поможет.
Мои предложения
Вы можете ограничить разрешенный ввод на стороне клиента
Handlebars.SafeString()
— ссылка https://stackoverflow.com/a/21471546/1163786применить проверку ввода на стороне сервера
Основная тема — «Фильтрация и проверка входных данных» входящего пользовательского ввода.
Вы спрашивали о «наилучшей практике» или «как решить эту проблему».
Это описано здесь:
Для многих веб-приложений простого выхода из HTML недостаточно. Вы, вероятно
хотите полностью удалить любой HTML или разрешить небольшое подмножество HTML
через. Для этого используйте Очиститель HTML библиотека.Но это очень медленно для сложного HTML. Подумайте о настройке решения для кэширования, чтобы сохранить очищенный результат для последующего использования.
Вы найдете пример кода для работы с HTML Purifier при переходе по последней ссылке. Очиститель использует подход белого / черного списка тегов HTML. Это медленно, потому что фильтрация — сложная задача.
Есть и другие инструменты: http://htmlpurifier.org/comparison
Когда вы ограничиваете разрешенный вход для уценки, тогда вы можете использовать анализатор уценки для подготовки вывода. Это все равно будет анализировать весь ввод, но быстрее, чем применение очистки белого / черного списка.
Других решений пока нет …