Sanitize gem не любит двоеточие внутри атрибута href

Используя гем Sanitize, я очищаю HTML. В атрибуте href моих тегов привязки я хочу проанализировать следующее:

<a href="#fn:1">1</a>

Это необходимо для реализации сносок с использованием гем Kramdown.

Однако Sanitize, похоже, не нравится двоеточие внутри атрибута href. Вместо этого он просто выводит <a>1</a>, полностью пропуская атрибут href.

Мой дезинфицирующий код выглядит так:

# Setup whitelist of html elements, attributes, and protocols that are allowed.
allowed_elements = ['h2', 'a', 'img', 'p', 'ul', 'ol', 'li', 'strong', 'em', 'cite', 
  'blockquote', 'code', 'pre', 'dl', 'dt', 'dd', 'br', 'hr', 'sup', 'div']
allowed_attributes = {'a' => ['href', 'rel', 'rev'], 'img' => ['src', 'alt'], 
  'sup' => ['id'], 'div' => ['class'], 'li' => ['id']}
allowed_protocols = {'a' => {'href' => ['http', 'https', 'mailto', :relative]}}

# Clean text of any unwanted html tags.
html = Sanitize.clean(html, :elements => allowed_elements, :attributes => allowed_attributes, 
  :protocols => allowed_protocols)

Есть ли способ заставить Sanitize принимать двоеточие в атрибуте href?


person Chris Alley    schedule 12.05.2011    source источник


Ответы (1)


Это Sanitize, который по умолчанию делает самую безопасную вещь. Предполагается, что часть URL-адреса перед : является протоколом (или схемой в терминологии RFC 1738), а поскольку #fn отсутствует в белом списке протоколов, весь атрибут href удаляется.

Вы можете разрешить такие URL-адреса, добавив #fn в белый список протоколов:

allowed_protocols = {'a' => {'href' => ['#fn', 'http', 'https', 'mailto', :relative]}}
person Ryan Grove    schedule 16.05.2011
comment
Для тех, кто проголосовал против этого: Райан — это парень, который написал Sanitize. Если кто и знает правильный ответ, то это, вероятно, он. - person Mathias Bynens; 16.05.2011
comment
Это сработало отлично, спасибо! Просто обратите внимание на всех, кто реализует это решение, вам нужно будет добавить '#fnref' для ссылок на сноски, которые также ссылаются на сноску. Например. allowed_protocols = {'a' => {'href' => ['#fn', '#fnref', 'http', 'https', 'mailto', :relative]}} - person Chris Alley; 19.05.2011