Использование элемента CDATA в XML уязвимо или нет?


Является ли он уязвимым при использовании элемента CDATA в XML-документах? Если да, то что произойдет, если мы используем элемент CDATA в XML-документах?

3 6

3 ответа:

Я не знаю, что вы подразумеваете под "уязвимостью", но есть одна ошибка, которую многие люди делают с разделами CDATA. Это происходит, когда ленивый программист на самом деле не понимает текстового экранирования и пытается избежать обычного процесса &-кодирования специальных символов в XML. Они думают, что им сойдет с рук:

print "<element><![CDATA["+textstring+"]]></element>";

И хотя это действительно остановит < или & символ в textstring, обрабатываемый как разметка, он не является водонепроницаемым, потому что textstring может содержать последовательность ]]> , в результате чего:

<element><![CDATA[ Foo ]]> <bar>I'm an unexpected element!</bar> ]]></element>

Это XML-инъекция, которая, как и HTML-инъекция, потенциально может иметь XSS-подобный эффект безопасности.

Так что вам все равно придется экранировать некоторые последовательности в CDATA (обычно вы разделяете последовательность ]]> между двумя секциями CDATA). На практике это делает использование CDATA не проще, чем просто &-кодирование текстового содержимого обычным способом. Так что на самом деле нет никакой причины когда-либо использовать раздел CDATA.

Раздел CDATA-это просто другой способ представления символьных данных в XML-документе. Это означает точно то же самое, что и любой другой (не тег) текст в документе, за исключением того, что он экранируется по-разному.

Нет никакой дополнительной "уязвимости", связанной с CDATA (за исключением ошибок в вашей библиотеке синтаксического анализа XML, конечно).

Уязвимы для чего? Какой-то инъекционный приступ? CDATA говорит синтаксическому анализатору передавать содержимое без его разбора, поэтому, если вы проверяете свой XML, я полагаю, что раздел CDATA пропускает шаг проверки.

Код, использующий поток XML, должен иметь некоторую бизнес-валидацию выше и за пределами проверки схемы, поэтому вы рискуете только в том случае, если не сможете проверить входные данные перед их использованием.