Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

17.09.2024

Як безпечно показати HTML?

Уявіть що вам потрібно показати на сайті фрагмент чужого HTML. Сподіваюся, очевидно, що це відкриває загрозу злому: в першу чергу, через виконання JavaScript можна вкрасти авторизаційні кукі, іншу інформацію, та навіть викликати API та завантажувати сторінки сайту. Хочу розглянути способи захисту.

Найтрадиційніший спосіб, відомий по форумах — обмеження змісту HTML до безпечних тегів та атрибутів. Обовʼязково це повинен бути саме список безпечних, а не небезпечних елементів — але й так існує ризик всього не передбачити.

До того ж обмеження змісту передбачає контроль HTML на вході; вже готовий HTML можна зачищати. Але будь-який санітайзер HTML обовʼязково змінюватиме його, принаймні щоб виправити можливі помилки. Тож ми вже не побачимо вхідний HTML “як було” - що може бути небажано.

Другий поширений спосіб: віддавати сторінку HTML з іншого домену. Тоді ця сторінка не отримає кукі з нашого сайту. Але нюанс: тоді й авторизацію доведеться придумати суто за URL. Як відоме рішення, є підписані URL на S3.

Ізоляції даних можна досягнути й через використання Blob URL, колись я про це згадував. Його можна відкрити як на новій сторінці, так і у фреймі. Це рішення потребує JavaScript, зате не потребує додаткової авторизації.

До речі, у <iframe> є корисний атрибут sandbox, яким можна зовсім вимкнути JavaScript та інші функції — наприклад, форми. Підтримка його наразі цілих 97% - але я б все одно використовував його разом з іншими методами.

Нарешті, є радикальна опція “Opera Mini”: взагалі відображати HTML в ізольованому браузері на сервері, а клієнтові віддавати тільки його зображення. Так втрачаємо всяку інтерактивність, зате в нападників просто не залишається шансів.