Нужно ли добавлять отсутствующие закрывающие теги как часть очистки HTML, чтобы предотвратить атаки XSS? - PullRequest
3 голосов
/ 15 августа 2011

Я использую гем Sanitize, чтобы запретить HTML-код, который можно использовать для атаки XSS. Как побочный эффект, HTML также очищается. Отсутствующие закрывающие теги добавляются. Обычно это нормально, но во многих случаях это меняет форматирование содержимого. В конечном счете, я хотел бы полностью очистить HTML, но не хочу делать это как часть защиты сайта от XSS.

Итак, есть ли пропущенные конечные теги (например, </font>) потенциальным эксплойтом XSS? Если нет, то как мне остановить Sanitizer от попыток очистить HTML тоже?

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Sanitize построен на вершине Nokogiri :

Поскольку Sanitize основан на полнофункциональном парсере HTML-кода Nokogiri, а не на куче хрупких регулярных выражений, он без проблем справляется с искаженным или злонамеренно сформированным HTML и всегда выводит действительный HTML или XHTML .

Акцент мой. Таким образом, ответ «нет», вы должны исправить свой сломанный HTML.

Nokogiri должен исправить HTML так, чтобы его можно было правильно интерпретировать и построить DOM, затем Sanitize модифицирует DOM, который создает Nokogiri, и, наконец, этот модифицированный DOM будет сериализован для получения HTML, который вы сохраните. .

Если вы отсканируете источник Sanitize, вы увидите, что все в итоге проходит через clean! и что будет использоваться to_html или to_xhtml методы:

if @config[:output] == :xhtml
  output_method = fragment.method(:to_xhtml)
  output_method_params[:save_with] = Nokogiri::XML::Node::SaveOptions::AS_XHTML
elsif @config[:output] == :html
  output_method = fragment.method(:to_html)
else
  raise Error, "unsupported output format: #{@config[:output]}"
end

result = output_method.call(output_method_params)

Таким образом, вы получаете версию HTML от Nokogiri, а не просто ваш HTML с удаленными плохими частями.

0 голосов
/ 16 августа 2011

Возможно, вы можете настроить sanitize, как показано в документации :

По умолчанию Sanitize удаляет весь HTML.Вы можете использовать один из встроенных конфигов, чтобы сказать Sanitize разрешить определенные атрибуты и элементы:

Sanitize.clean(html, Sanitize::Config::RESTRICTED)
# => '<b>foo</b>'

Sanitize.clean(html, Sanitize::Config::BASIC)
# => '<b><a href="http://foo.com/" rel="nofollow">foo</a></b>'

Sanitize.clean(html, Sanitize::Config::RELAXED)
# => '<b><a href="http://foo.com/">foo</a></b><img

src = "http://foo.com/bar.jpg" /> '

Или, если вынапример, больше контроля над тем, что разрешено, вы можете предоставить свою собственную пользовательскую конфигурацию:

Sanitize.clean(html, :elements => ['a', 'span'],
    :attributes => {'a' => ['href', 'title'], 'span' =>

['class']},: protocol => {'a' => {'href' => ['http',' https ',' mailto ']}})

Цитируется по wonko.com

...