Функция jQuery .html () вызывает предупреждение CWE-80: неправильная нейтрализация связанных со скриптом HTML-тегов на веб-странице (базовый XSS) в Veracode

Я запустил свое веб-приложение (созданное с помощью Play Framework с использованием Java) через Veracode, и оно вернуло предупреждение:

CWE-80: Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)

для моей функции jQuery .html().

Я обновляю элемент <table> с помощью HTML из вызова REST.

Вот код JavaScript:

function getPTPComments() {
    var finalURL = restURL + "/restGetCommentsTable";
    var keyToSend = $("#ptpKey").val();
    var htmlTable = "";

    // Clear the comments table...
    $("#displayCommentsOnTab").empty();

    $.ajax({
        type: "POST",
        url: finalURL,
        data: keyToSend,
        dataType: "text",
        contentType: "text/plain",
        success: function (resp) {
            htmlTable = resp;
        },
        error: function (req, status, err) {
            console.log("tabCommentsTab - something went wrong");
            console.log("tabCommentsTab - req: " + req);
            console.log("tabCommentsTab - status: " + status);
            console.log("tabCommentsTab - err: " + err);
        }
    });

    // Replace table html with htmlTable...
    $("#displayCommentsOnTab").html(htmlTable); // WARNING HERE
}

Я нашел несколько сообщений об этом, но не знаю, как изменить свой код, чтобы удалить это предупреждение:

Избегайте Veracode CWE-80: неправильная нейтрализация связанного со скриптом HTML в методе jquery htm ()

Как исправить «Неправильная нейтрализация связанных со скриптом HTML-тегов на веб-странице (базовый XSS)» в строке вывода PHP

https://www.codeproject.com/Questions/1062655/Improper-Neutralization-of-Script-Related-HTML-Tag

Если у вас есть идеи, как обновить мой код, я с нетерпением жду вашего ответа.


person Dan    schedule 08.08.2018    source источник
comment
Ваш код все равно не будет работать, потому что вы пытаетесь использовать ответ ajax до того, как ответ действительно придет.   -  person Pointy    schedule 08.08.2018
comment
Код выше работает нормально. Как мне исправить jQuery, чтобы я не получал это предупреждение от Veracode? Я ценю помощь.   -  person Dan    schedule 08.08.2018
comment
Это не может работать. Обратный вызов успешного выполнения будет вызываться спустя долгое время после того, как будет сделан этот вызов .html(), потому что он является результатом асинхронного HTTP-запроса. Что касается ошибки Veracode, насколько я могу судить, этот продукт в целом неправильный; может быть опасным обновлять DOM таким образом, но в этом нет никакой уверенности.   -  person Pointy    schedule 08.08.2018
comment
Другой вопрос: как вы подойдете к написанию приведенного выше кода, если он написан в неправильной последовательности? Жду вашего ответа - спасибо!   -  person Dan    schedule 08.08.2018
comment
@Dan поместил последнюю строку кода о замене таблицы html в обработчике успеха. (не ответ на вашу проблему с предупреждением)   -  person Mark Baijens    schedule 08.08.2018
comment
Поместите строку $("#displayCommentsOnTab").html(htmlTable); внутрь обратного вызова успеха.   -  person Pointy    schedule 08.08.2018
comment
Спасибо! Я сделаю это. Есть ли другие идеи о том, как избежать этого предупреждения?   -  person Dan    schedule 08.08.2018


Ответы (1)


HTML-код, возвращаемый API, считается небезопасным или «испорченным». Вот почему он помечается, когда вы вставляете его в DOM как HTML.

Если у вас есть возможность изменить API или написать новый API, то одним из решений будет создание API, который возвращает данные для таблицы, а не саму таблицу html. Затем вы можете использовать метод jquery .text() для вставки данных в таблицу, которую вы создаете на JavaScript. Используя текстовый метод, вы исключите возможность внедрения произвольного HTML или скриптов, возвращаемых API.

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

person Jeremy    schedule 09.08.2018