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

Проблема

В статье рассмотрен случай XSS-уязвимости при разработке на Java Script использованием DHTML-компонентов Prognoz Platform 8.

Рассмотрим на примере компонента 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 имеет смысл только там, где отображаются данные, которые вносит в базу пользователь или администратор, либо их внесение предполагается сделать в одной из следующих версий продукта.

См. также:

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