2011-01-30 3 views
1

У меня есть таблица стилей XSLT, которая обрабатывает XML-документ для создания HTML.Предотвращение XSS (и других атак) в XSLT сгенерированном содержимом

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

Что мне нужно знать, чтобы достичь этого?

UPDATE:

Я знаю, что по умолчанию XSLT ускользает выход (который может быть отключен с помощью атрибута disable-output-escaping) - это достаточно, чтобы предотвратить кто-то от того, чтобы внедрить вредоносные элементы HTML и атрибуты?

+0

Не могли бы вы объяснить, почему вы разрешаете пользователям предоставлять собственные XML-документы? Можете ли вы принудительно выполнить проверку с помощью схемы, чтобы избежать каких-либо проблем? – sisve

+0

@Simon XML-документ - это план выполнения SQL-запросов - им не разрешено предоставлять его, но его достаточно просто для создания запроса (его для [data explorer] (http://data.stackexchange.com/)) который содержит XML-документ, который рассматривается как план выполнения - я не могу придумать, как предотвратить это. Существует уже [схема] (http://schemas.microsoft.com/sqlserver/2004/07/showplan/), но я не уверен, насколько валидация этой схемы поможет предотвратить атаки? – Justin

+0

Это * не * вопрос XSLT - исправлен. –

ответ

2

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

  • Вы никогда не должны использовать xsl: copy или xsl: copy-of. Если вы скопируете узлы, отличные от текста, будут возможны атаки XSS.
  • Вам не следует использовать сложные или рекурсивные правила. Специально созданный вход может создать DoS за счет задержки обработки XSLT или сбоя процессора.
  • Кроме того, как вы упомянули, не отключите выходное экранирование.

Если вы передаете результат преобразования на SQL-сервер, вы не должны помещать какие-либо предоставленные данные в ваш SQL-запрос.

Например, это ПЛОХО:

<xsl:if test="@order">ORDER BY <xsl:value-of select="@order"/></xsl:test> 

Это ХОРОШО:

<xsl:if test="@order">ORDER BY 
    <xsl:chose><xsl:when test="@order = 'foo'">foo</xsl:when> [...] </xsl:chose> 
</xsl:test> 

Если вам действительно нужно передать данные в запросе, использовать переменные связывания.

+1

Также проверьте свой XML-вход на схему для ошибок. Если вы не получаете плохие данные в системе, вам вряд ли придется иметь дело с плохими данными. –

+0

@Yzmir Рамирес прав. Вы должны ** сначала ** проверить входной источник, и вы даже можете проверить входной источник с таблицами стилей XSLT 2.0. В этом и заключалась вся валидация. –