Защита от XSS при использовании DHTML-компонентов

Проблема

В статье рассмотрен случай XSS-уязвимости при разработке на Java Script использованием DHTML-компонентов продукта «Форсайт. Аналитическая платформа».

Рассмотрим на примере компонента ListBox. Пусть список его элементов приходит из базы данных веб-приложения.

var data = ["list1", "<b> xss <" + "/b>"];//Предполагаем, что этот список был получен с серверной части веб-приложения

var listBox = new PP.Ui.ListBox({

    Items: [

        { Content: data[0] },

        { Content: data[1] }

    ],

    ParentNode: document.body

});

После выполнения примера на странице будет размещен компонент ListBox с элементами list1 и xss, хотя ожидалось: list1, <b> xss </b>.

Важно. Приведен пример безобидной XSS-уязвимости, но вместо тега жирности в текст элемента можно вставить элемент <script>, который перенаправляет страницу на сайт злоумышленника.

Решение

Это произошло потому, что в свойство Content всех элементов управления можно записать html строку и готовую domNode.Control.

Исправить можно следующим образом:

var data = ["list1", "<b> xss <" + "/b>"];

var listBox = new PP.Ui.ListBox({

    Items: [

        { Content: PP.escapeHTML(data[0]) },

        { Content: PP.escapeHTML(data[1]) }

    ],

    ParentNode: document.body

});

В результате получим элементы list1, <b> xss </b>.

Примечание. Использовать функцию PP.escapeHTML имеет смысл только там, где отображаются данные, которые вносит в базу пользователь или администратор, либо их внесение предполагается сделать в одной из следующих версий продукта.

См. также:

База знаний разработчиков веб-приложений