Защита от инъекций XSLT - PullRequest
       10

Защита от инъекций XSLT

1 голос
/ 22 октября 2009

Я использую xsl-трансформ для преобразования XML-файла в HTML в dotNet. Я преобразую значения узлов в xml в содержимое и атрибуты тегов html.

Я сочиняю xml с помощью манипуляции .Net DOM, устанавливая свойство InnerText для узлов с произвольным и, возможно, вредоносным текстом. Прямо сейчас злонамеренно созданные строки ввода сделают мой HTML небезопасным. Небезопасно в том смысле, что некоторый javascript может исходить от пользователя и находить путь к атрибуту ссылки href в выходном html, например.

Вопрос прост: что такое очистка, если таковая имеется, что я должен делать с моим текстом перед назначением его свойству InnerText? Я думал, что присвоение InnerText вместо InnerXml сделает всю необходимую очистку текста, но, похоже, это не так.

Должно ли мое преобразование обладать какими-то особыми характеристиками для безопасной работы? Какие-нибудь специфические предостережения .net, о которых я должен знать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 октября 2009

Оказывается, проблема возникла в самом xsl, который использовал escape-output-escape-escape. Без этого сам Tranform будет выполнять всю необходимую кодировку.

Если вы должны использовать отключение-выход-экранирование, вы должны использовать функцию appriate encodeinf для каждого элемента. HtmlEncode для содержимого тегов, HtmlAttributeEncode для значений атрибутов и UrlEncode для значений атрибутов html (например, href)

0 голосов
/ 22 октября 2009

Вы должны очистить ваш XML перед преобразованием его с помощью XSLT. Вам, вероятно, понадобится что-то вроде:

string encoded = HttpUtility.HtmlEncode("<script>alert('hi')</script>");
XmlElement node = xml.CreateElement("code");
node.InnerText = encoded;

Console.WriteLine(encoded);
Console.WriteLine(node.OuterXml);

С этим вы получите

&lt;script&gt;alert('hi')&lt;/script&gt;

Когда вы добавите этот текст в свой узел, вы получите

<code>&amp;lt;script&amp;gt;alert('hi')&amp;lt;/script&amp;gt;</code>

Теперь, если вы запустите XSLT, этот кодированный HTML не вызовет проблем в вашем выводе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...