Как избежать XSS в этом c:out?

Обычно я сканирую изменения кода с помощью Veracode для обнаружения уязвимостей в системе безопасности. Теперь в БД есть строка, которую я собираю в строку с именем custFunctionality, и ранее я отображал это в jsp как:

out.println(<%= custFunctionality %>);

Что ж, Veracode отсканировал его и сообщил мне, что это дефект безопасности.

Поэтому я использовал c: out здесь как:

<c:out escapexml='false' value='${custFunctionality }'/>

Теперь проблема здесь в том, что строка состоит из разметки, связанной с html, и специальных символов, которые мне нужно показать на странице, и если я не даю escapexml='false' эти символы, и разметка не материализуется. Однако, поскольку здесь в коде есть строка escapexml='false', это представляет собой дефект безопасности для veracode, как я обнаружил после повторного сканирования файла.

Может ли кто-нибудь предложить мне альтернативное решение из этой трясины?


person The Dark Knight    schedule 27.06.2013    source источник
comment
какие-нибудь решения, ребята?   -  person The Dark Knight    schedule 27.06.2013
comment
строка состоит из разметки, связанной с html, и специальных символов - можете ли вы уточнить, нужно ли вам, чтобы они интерпретировались браузером как часть HTML страницы или просто отображались пользователю визуально?   -  person u2702    schedule 02.07.2013
comment
@ u2702 : будет отображаться пользователю визуально, а иногда и как часть html-страницы.   -  person The Dark Knight    schedule 03.07.2013


Ответы (1)


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

Визуальный дисплей:

Что вы хотите сделать здесь, так это взять специальные символы, которые браузер хочет интерпретировать как разметку, и экранировать (или закодировать) их таким образом, чтобы указать браузеру, что они должны просто отображаться. Алекс порекомендовал StringEscapeUtils, который должен помочь вам в этом. (Имейте в виду, что каждый контекст имеет свои собственные правила экранирования, поэтому то, что работает для html, не обязательно будет работать для css и javascript.)

Вставка разметки:

В этом случае вам нужно выполнить некоторую проверку ввода, чтобы убедиться, что вы не вставляете контент, который влияет на поведение вашей страницы. Вставка некоторой разметки ..., вероятно, допустима, вставка javascript рискованна. Задача состоит в том, чтобы уловить все способы, которыми люди могут попытаться обойти ваш фильтр. Если ваш сайт достаточно интересен, люди попытаются воспользоваться этой функцией.

person u2702    schedule 03.07.2013